LeetCode93-复原IP地址
题目
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。
示例
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
解法
思路:将三个点插入到这一个字符串中,将字符串分割成4个部分,每个部分进行检查,如果是在0-255之间,则成立。
优化剪枝:
(1)字符串长度为len,当分割点分割i出来第i段,但是len-3*(4-i)>0,则表明这一段不成立,这个分割点要继续向后遍历。
(2)若某个分割点分割出来的字符段已经不属于0-255之间,那么这个分割点当前和向后遍历出来的所有段落,都没有用了,直接break这个循环。、
注意:
分割出来的ip地址,若某个段落长度大于1,但是首个字符是0,则证明这个字符段是非法的。
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> res = new LinkedList<>();
int len = s.length();
if(len < 4 || len > 12) return res;
for(int i = 1 ; i <= 3 && i < len - 2; ++i){
//若后面的字符段太长,以至于不能分割出三个长度都小于等于3的字符段
//则这个分割点应该继续向后遍历。
if(i<len - 9) continue;
String curA = s.substring(0,i);
//若这个分割点分割出的字符段是不符合0-255之间标准的
//则不用继续向后遍历,直接跳出这个循环
if(!isTrue(curA)) break;
for(int j = i + 1; j <= i + 3 && j < len - 1; ++j){
if(j<len-6) continue;
String curB = s.substring(i,j);
if(!isTrue(curB)) break;
for(int l = j + 1; l <= j + 3 && l < len ; ++l){
if(l<len-3) continue;
String curC = s.substring(j,l);
String curD = s.substring(l,len);
if(isTrue(curC)&&isTrue(curD)){
StringBuilder stb = new StringBuilder();
stb.append(curA);
stb.append('.');
stb.append(curB);
stb.append('.');
stb.append(curC);
stb.append('.');
stb.append(curD);
res.add(stb.toString());
}
}
}
}
return res;
}
public boolean isTrue(String s){
int len = s.length();
//若这个字符段第一个字符是0,但是长度不为0,则非法
if(s.charAt(0)=='0' && len > 1) return false;
int sum = 0;
for(int i = 0; i < len ; ++i){
sum = sum * 10 + s.charAt(i)-'0';
}
if(sum<=255) return true;
return false;
}
}