分割后的字符串是不能够以0开头的,老师的代码有点考虑欠缺

来源:6-2 复原IP地址-代码演示

黄ty的前端血泪学习史

2019-03-04

如果字符串为‘010010’是不能被分割为‘0.1.0.010’

下面的代码是网上找的,排除了分割出来的字符串起始位置为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完全通过!

0
0

快乐动起来呀

2019-03-04

嗯嗯,课程重点是讲算法思路,给予边界的考虑权重小了些,多谢反馈,可以在issue区贡献代码吗,后续统一给予奖励

0
0

JavaScript版 数据结构与算法

填补前端同学的算法短板,掌握面试中最常见的算法与数据结构

2467 学习 · 395 问题

查看课程