93.复原IP地址
思路
按照昨天分割字符串的套路。
点1:终止条件设为在遍历完整个串时发生,且这道题目需要考虑将分割的子串数,即ip地址为四段,因此需要两个共同条件:遍历整串+子串四段。若只达到其中一个而另一个不满足,则返回。
点2:在for循环分割串时,正常分割从startIndex开始,母串尾结束,这道题需要额外考虑其他三个条件。1.子串长小于3 2.不能由0作为数字开端,0除外 3.子串大小介于0-255
点3:利用StringBuilder构建串时,需要添加删除,删除最后一个网段。
前面两个点在写题时基本考虑到,因为最后一个点一直错。
正确应该书写为:stringBuilder.delete(startIndex+num-1,i+num+1);
我写为了:stringBuilder.delete(stringBuilder.length()-temp.length(),stringBuilder.length());
应该是由stringbuilder全局变量引起的错误
代码
class Solution {
List<String> result =new ArrayList<>();
StringBuilder stringBuilder=new StringBuilder();
int num=0;
public List<String> restoreIpAddresses(String s) {
backTracking(s,0);
return result;
}
public void backTracking(String s,int startIndex){
if (num==4){
if (startIndex<s.length()){
return;
}else {
result.add(stringBuilder.toString());
return;
}
}
for (int i=startIndex;i<s.length();i++){
String temp=s.substring(startIndex,i+1);
if (temp.length()>3)break;
if (Integer.parseInt(temp)>=0 && Integer.parseInt(temp)<=255){
if (temp.length()>1 && temp.charAt(0)-'0'==0) return;
stringBuilder.append(temp);
num++;
if (num<4){
stringBuilder.append('.');
}
backTracking(s,i+1);
stringBuilder.delete(startIndex+num-1,i+num+1);
num--;
}
}
}
}