「这是我参与2022首次更文挑战的第39天,活动详情查看:2022首次更文挑战」
题目
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
- 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例1
输入: s = "25525511135"
输出: ["255.255.11.135","255.255.111.35"]
复制代码
示例2
输入: s = "0000"
输出: ["0.0.0.0"]
复制代码
示例3
输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
复制代码
提示
1 <= s.length <= 20
s
仅由数字组成
题解
回溯
本题思路可参考
上述3题同样可以是递归回溯思想;
下面的递归回溯思想的伪代码
dfs();
function dfs(){
if(终止条件) return
for(当前层所有可能的条件){
if(符合要求的条件){
// 继续递归
dfs()
}
}
}
复制代码
根据伪代码或者成为套路代码,咱们带入条件解决本题;
第一步
- 获取字符串长度
- 声明 存储答案
- 写
var restoreIpAddresses = function(s) {
const len = s.length
const result = [];
dfs();
function dfs(){
}
};
复制代码
第二步
- 参数,需要两个,一个记录已经找到的IP,一个记录找下一个IP需要的起始位置
- 已经找到的IP放在数组中,初始下一个IP需要的起始位置是0;
- 终止状态, 放弃吧,IP不可能超过4位,可以理解吧?
- 可能找到一个完成IP。后面的放弃吧
var restoreIpAddresses = function(s) {
const len = s.length
const result = [];
dfs(0,[]);
function dfs(level,path){
if(path.length > 4) return;
if (path.length === 4) return;
}
};
复制代码
第三步
- for循环区间 因为每个IP最多只有3位;
- 从起始位置开始,在 区间切割字符串 ;
- 判断切割得到的字符串是否符合条件,符合条件的继续递归,
var restoreIpAddresses = function(s) {
const len = s.length
const result = [];
dfs(0,[]);
function dfs(level,path){
if(path.length > 4) return;
if (path.length === 4) return;
for(let i = 1 ; i < 4 ; i++){
const t = s.substring(level,level+i)
if(check(t)){
path.push(path)
dfs(level+i,path)
path.pop()
}
}
}
function check(string){}
};
复制代码
条件
- 字符串不能是0开头
- 字符串不能大于225
- 不符合两个条件的字符串,放弃递归
function check(string) {
if (string[0] === '0' && string.length > 1) return false;
if (Number(string) > 255) return false;
return true;
}
复制代码
根据上述思路编辑代码如下:
var restoreIpAddresses = function (s) {
const len = s.length;
const result = [];
// dfs第一个参数表示步进值,第二个参数存放IP
dfs(0, []);
return result;
function dfs(level, path) {
if (path.length > 4) return;
if (path.length === 4 && level === len) {
result.push(path.join('.'));
return;
}
for (let i = 1; i < 4; i++) {
if (level + i > len) return;
const t = s.substring(level, level + i);
if (check(t)) {
path.push(t);
dfs(level + i, path);
path.pop();
}
}
}
function check(string) {
if (string[0] === '0' && string.length > 1) return false;
if (Number(string) > 255) return false;
return true;
}
};
复制代码
结语
作者水平有限,如有不足欢迎指正;任何意见和建议欢迎评论区浏览讨论