题意:给出一个由数字组成的字符串,求其能表示的ip地址列表
注意不能有前缀0,如010
思路:每次操作时,有两种情况,一种是添加点,一种是将其作为当前数的后序数。
在小数点的个数超过3时,递归退出。
如果小数点的个数为3,并且当前字符串的查找起点与字符串长度一样时,说明找到一种可行的ip地址。
具体代码如下:
public class Solution
{
private void backtrack(String s, int start, int dotNum, int curNum, String sb, List<String> ans)
{
if (dotNum > 3) return;
if (start == s.length()) {
if (dotNum == 3 && sb.charAt(sb.length() - 1) != '.') {
ans.add(sb);
}
return;
}
if (!sb.isEmpty() && sb.charAt(sb.length() - 1) != '.') {
backtrack(s, start, dotNum + 1, 0, sb + ".", ans);
}
if (curNum == 0 && s.charAt(start) == '0') {
if (start < s.length() - 1) backtrack(s, start + 1, dotNum + 1, 0, sb + "0.", ans);
else backtrack(s, start + 1, dotNum, 0, sb + "0", ans);
return;
}
int temp = curNum * 10 + s.charAt(start) - '0';
if (temp <= 255) {
backtrack(s, start + 1, dotNum, temp, sb + s.charAt(start), ans);
}
}
public List<String> restoreIpAddresses(String s)
{
List<String> ans = new ArrayList<>();
StringBuilder sb = new StringBuilder();
backtrack(s, 0, 0, 0, "", ans);
return ans;
}
}