1.题目:
有效 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"]
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/restore-ip-addresses 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.代码:
class Solution {
List<String> result = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
if(s.length()>12) return result;//也算是剪枝了
backTrack(s,0,0);
return result;
}
//
public void backTrack(String s,int startIndex,int pointNum){
if(pointNum==3){//当逗点的数量是3时,就满足了条件
if(isValid(s,startIndex,s.length()-1)){//这里也要判断第四段字符串是否合法,合法就放进集合中
result.add(s);
}
return ;
}
for(int i=startIndex;i<s.length(); i++){
if(isValid(s,startIndex,i)){//判断当前遍历到的字符串是否符合条件
s=s.substring(0,i+1)+"."+s.substring(i+1);//在字符串后面增加逗点
pointNum++;//逗点自增
backTrack(s,i+2,pointNum);//递归,注意是i+2,因为已经增加了逗点
pointNum--;//逗点回溯
s=s.substring(0,i+1)+s.substring(i+2);//回溯删掉逗点
}else{
break;
}
}
}
//判断字符串再左闭右闭区间组成的数字是否合法
public boolean isValid(String s,int start,int end){
if(start>end) return false;
if(s.charAt(start)=='0' && start!=end) return false;
int num = 0;
for(int i=start; i<=end; i++){
if(s.charAt(i)>'9' || s.charAt(i)<'0') return false;
num=num*10+(s.charAt(i)-'0');//把字符串变成整数的方法
if(num>255) return false;
}
return true;
}
}