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 = “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 仅由数字组成
思路
实际上乍一看就是分割字符串的翻版,但中间实验室项目插入,三周后重新捡起来这道题,我历经多次debug,终于做出来了。实际上需要考虑的有如下几点:
- 只能切成4段
- 要考虑每一段最多有3位数字
- 可能有00这样的数字,记得处理好,如果遇到开头是0的直接自成一段了
- 返回条件有两个,一个是插入了达到数量的’.'另一个是字符串遍历到结尾了。但只有这两点同时满足才是结果集的答案
题解
class Solution {
List<String> list = new ArrayList<>();
char[] str;
int cnt;
int idx;
public List<String> restoreIpAddresses(String s) {
// 开的大小也有讲究的,需要让其能容纳4个'.'
str = new char[s.length() + 4];
dfs(s, 0);
return list;
}
public void dfs(String s, int st) {
//满足限制条件4
if (cnt >= 4 || st == s.length()) {
// 需要理解为什么是idx-1,因为最终结尾时候我插入的是4个'.',需要去掉一个
if (st == s.length() && cnt == 4) {list.add(new String(str, 0, idx - 1));}
return;
}
// 满足限制条件3
if (s.charAt(st) == '0') {
str[idx++] = '0';
str[idx++] = '.';
cnt++;
dfs(s, st + 1);
idx -= 2;
cnt--;
}
else {
// i-st<3为了满足限制2
for (int i=st;i<s.length()&&i-st<3;i++) {
int tmp = Integer.valueOf(s.substring(st, i+1));
if (tmp < 256) {
for (int j=st;j<i+1;j++,idx++) {
str[idx] = s.charAt(j);
}
str[idx++] = '.';
cnt++;
dfs(s, i + 1);
idx = idx - 1 - (i + 1 - st);
cnt--;
}
}
}
}
}