93. 复原IP地址
2020-10-19
复原IP地址
/** * @param {string} s * @return {string[]} */ var restoreIpAddresses = function (s) { // 如果传入的字符串太长或者比255255255255还大 说明不可能有正常的IP if (s.length > 12 || Number(s) > 255255255255) return []; let ans = []; /** * * @param {*} str 此次递归处理的字符串 * @param {*} IP 暂时的一个IP的数组 每一项是ip的第0123项 * @param {*} len 当前IP找到第几项了 */ const handle = (str, IP, len) => { // 如果剩下的字符串的长度 比 这个还长 说明字符串太多了 可以直接return出来 // 例如:当前找到IP的第2项 str 如果还有7位 就不可能是合理的IP 因为剩下两项顶多有6位 // 如果 str 已经为空字符串了 也直接return // 例如找完10.10.2.3之后 紧接着会回到第2位把2变成23 然后找第3位 此时str已经是空 也就是 10.10.23.'' 这种情况如果不处理就会漏掉 if (str.length > (4 - len) * 3 || !str) return; // IP的每一项都可能是 1-3 位的数 for (let i = 0; i < 3; i++) { // 当在找第4位的IP的时候 如果有剩余str肯定是不行的 比如当前在找第4位 此时str='123' // 当i=0时 第四位得到的值是1 但是str就还剩23多余 所以i!=1 应该找i=2或者i=3合不合适 if (len === 3 && str.length - (i + 1) > 0) continue; // tmp 是此次 IP 第 len 项的值 const tmp = str.slice(0, i + 1); // 如果 当前位的IP是3位 且比255大 直接return // 如果出现 01 011 这种 0 开头的 直接return if (Number(tmp) > 255 || (tmp.length > 1 && tmp[0] === '0')) return; // 重写IP的第len项 IP[len] = tmp; // 如果len已经等于3说明找到了完整合格的IP 放入ans中 如果str还有剩余是不可能走到这里的 在上面就return了 if (len === 3) { ans.push(IP.join('.')); return; } // 如果len还不到3 那就继续往下找 if (len < 3 && str.length) { // 注意 每次往下找 应该截取tmp之后的字符串作为下次的str handle(str.slice(i + 1), IP, len + 1); } } } handle(s, [], 0); return ans; };