分割后的字符串是不能够以0开头的,老师的代码有点考虑欠缺
来源:6-2 复原IP地址-代码演示

黄ty的前端血泪学习史
2019-03-04
下面的代码是网上找的,排除了分割出来的字符串起始位置为0的情况。
var restoreIpAddresses = function (s) {
let result = []
const restore = (s, len, current) => {
if (len === 0 && s === '') return result.push(current.join('.'))
if (len === 0 || s === '') return
s.length >= 1 && restore(s.slice(1), len - 1, [...current, s.slice(0, 1)])
!(s.startsWith('0')) && s.length >= 2 && restore(s.slice(2), len - 1, [...current, s.slice(0, 2)])
!(s.startsWith('0')) && s.length >= 3 && s.slice(0, 3) < '256' && restore(s.slice(3), len - 1, [...current, s.slice(0, 3)])
}
restore(s, 4, [])
return result
}
下面写一点注释。
restore就是老师上课说的递归函数,s是输入的字符串,len用来记录余下的分割次数(len为0则表示已经完成分割),current是从s中分割出来的字符串。result是用来保存分割后,满足条件的结果的。
对于
if (len === 0 && s === '') return result.push(current.join('.'))
if (len === 0 || s === '') return
如果字符串已经被毫无保留的分成4部分,存到result里面。 如果字符串已经被分成4部分,但是字符串s还没有为空,终止递归。
对于
s.length >= 1 && restore(s.slice(1), len - 1, [...current, s.slice(0, 1)])
如果 s.length>1, 执行下面的restore代码,分割出s中的第一个字符串
比如字符串’010010’,s.length>1,将执行restore(‘10010’,3,[‘0’])
对于
!(s.startsWith('0')) && s.length >= 2 && restore(s.slice(2), len - 1, [...current, s.slice(0, 2)])
同理,只要分割完的子串不出现开头为0且长度大于2的情况,就会执行restore(s.slice(2),…)
!(s.startsWith('0')) && s.length >= 3 && s.slice(0, 3) < '256' && restore(s.slice(3), len - 1, [...current, s.slice(0, 3)])
同理,只要分割完的子串不出现开头为0的情况,且长度大于3,小于256,
就会执行restore(s.slice(3),…)
最后返回result
(完)
2回答
-
橙序猿哥哥
2019-06-10
其实只要在老师的代码基础上稍加修改,将每次分割出来的片段 parseInt() 一下就可以了,parseInt 会自动将类似于 010 的数变为 10,再结合老师的终止判断条件,cur.length === 4 && cur.join("") === str 就可以很好解决这个问题了,leetcode完全通过!
00 -
快乐动起来呀
2019-03-04
嗯嗯,课程重点是讲算法思路,给予边界的考虑权重小了些,多谢反馈,可以在issue区贡献代码吗,后续统一给予奖励
00
相似问题