LeetCode-93. 复原 IP 地址
题目来源
题目详情
有效 IP 地址 正好由四个整数(每个整数位于 0
到 255
之间组成,且不能含有前导 0
),整数之间用 '.'
分隔。
- 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 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 = "1111"
输出: ["1.1.1.1"]
示例 4:
输入: s = "010010"
输出: ["0.10.0.10","0.100.1.0"]
示例 5:
输入: s = "101023"
输出: ["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
提示:
0 <= s.length <= 20
s
仅由数字组成
题解分析
解法一:深度优先搜索 + 回溯
- 本题最容易想到的就是使用回溯的思想,依次递增位置变量来指示现在处理到的位置,直到遇到字符串结尾。
- 此外,需要设置一个cnt计数器来表示IP地址目前的第几个部分,只有当cnt == 4且遍历到原串结尾时才表示找到了符合条件的IP地址。
- 本题需要注意的是,合规的IP地址是不能包含前导0的,所以这里需要在代码中做一点额外的处理。
class Solution {
List<String> res = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
dfs(s, 0, "", 0);
return res;
}
private void dfs(String s, int pos, String ans, int cnt){
if(cnt > 4){
return;
}
if(pos == s.length()){
if(cnt == 4){
res.add(ans.substring(0, ans.length() - 1));
}
return;
}
int num = 0;
for(int i=pos; i<s.length(); i++){
char temp = s.charAt(i);
if(i == pos && temp == '0'){
dfs(s, i + 1, ans + "0.", cnt + 1);
break;
}
num = num * 10 + temp - '0';
ans = ans + temp;
if(num >=0 && num <= 255){
dfs(s, i + 1, ans + ".", cnt + 1);
}else{
break;
}
}
}
}
结果展示
Either Excellent or Rusty