https://leetcode.com/problems/restore-ip-addresses/
IP切分,给出一个字符串,求出能切分成字符串的所有可能
例:Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList();
if (s == null || s.length() == 0 || s.length() < 4 || s.length() > 12) {
return res;
}
IpHelper(s, 0, "", res);
return res;
}
//怎么翻译这个function,怎么翻译?怎么翻译?怎么翻译?怎么翻译?
//对于输入string s,当前递归到了第n段(一个IP段总共由4个0~255的int组成)
//临时的结果out
//最终结果res
public void IpHelper(String s, int n, String out, List<String> res) {
//当n此时为第4段的时候,IP段走到了int的最后一个int
if (n == 4) {
//当s为空的时候,out此时可以作为一个结果
//至于out是不是合法的,在上一个迭代的val那一步已经判断的,所以一定是合法的
if (s.isEmpty()) {
res.add(out);
}
return;
}
//k表明取s子串的个数,因为每一个数字都在0~255之间,所以子串的位数是在1~3之间
for (int k = 1; k < 4; k++) {
//可能出现剩余的s本身就不够3位了,所以循环直接终止
if (s.length() < k) {
break;
}
//针对s,直接取大小为k的子串,并转换为整形
int val = Integer.parseInt(s.substring(0, k));
//整形的范围判断,大于255 则失败
//第二个条件,为了避免255010123321,这是切分了255.010.123.321,当此时的val是010,intval后为10,不符合条件
// "10"的length为2,而此时k为3
if (val > 255 || k != String.valueOf(val).length()) {
continue;
}
//来来来,我们先翻译一下s.substring(k)
//Returns a string that is a substring of this string. The
//substring begins with the character at the specified index and
//extends to the end of this string.
//所以255255123123 ,k=1的时候 s.substring(1) = 55255123123,当k=2,3的时候类推
//下一个迭代,需要计算下一个int,所以n+1
IpHelper(s.substring(k), n + 1, out + s.substring(0, k) + (n == 3 ? "" : "."), res);
}
}
网友评论