设置一个list的结果集result
回溯三部曲:
返回值和参数:返回值为空,参数为字符串s、开始下标startindex和已经打点数量pointsum
结束条件:打点数量为3时结束并判断剩余字符串是否合法,合法则输出至结果集,否则直接返回上一层
单层递归逻辑:
for循环(i=startindex;i
合法则在i后打上一个点(s=s.substring(0,i+1)+“.”+s.substring(i+1,s.length());)
对打点数量加一,
在对其后面的字符串分割(调用递归函数参数为s,i+2,pointsum)(为什么此处为i+2?)
回溯:将打的点删除并pointsum减一
1.为什么不用continue?
此题来说,如果当前分割的不合法则后面再怎么分割也不合法,可以分为以下几种情况1.当前分割范围内字符串首字符为0,那就是再向后移动分割也无法合法2.含非法字符,则和上面相同3.超过255,再移动则会更大,绝对超过255,综上所述,不使用continue直接使用break。
2.为什么此处为i+2?
因为上面再i的后面加了个点,所以之前的i+1就变成的i+2
class Solution {
List result = new ArrayList<>();//结果集
public List restoreIpAddresses(String s) {//主函数
fuyuanIp(s,0,0);//调用递归函数,开始下标设置为0,打点个数为0
return result;
}
public void fuyuanIp(String s,int startindex,int pointsum){//递归函数
if(pointsum == 3){//结束条件,打点数量为3时,说明只剩后面需要判断
//此处为什么不用最大长度作为结束条件?
//本题只需要对中间的地方进行打点,最后不需要,所以就不能使用最大长度
if(isvalid(s,startindex,s.length()-1)){//判断最后剩余字符串是否合法ip
result.add(s);
}
return;
}
for(int i=startindex;iend){//范围异常,返回false
return false;
}
if(s.charAt(start) == '0' && start!=end){//首字符为0,返回false
return false;
}
int num=0;
for(int i=start;i<=end;i++){
if(s.charAt(i)<'0'||s.charAt(i)>'9'){return false;}//含有非法字符,返回false
}
num =num*10 + (s.charAt(i)-'0');
if(num>255){return false;}//值大于255,返回false
}
return true;
}
}