这个题难度倒是没多少。递归回溯。不过要考虑0出来后面必须没有东西。这个特殊情况。
public class Solution {
String s;
List<String> result;
StringBuilder sb;
public List<String> restoreIpAddresses(String s) {
this.s=s;
result=new LinkedList<String>();
sb=new StringBuilder();
help(0,1);
for(String str:result)
{
System.out.println(str);
}
return result;
}
public void help(int start,int index)
{
if(index>=5)
{
if(start>=s.length())
{
result.add(sb.toString());
}
return ;
}
for(int i=0;i<3&&start+i+1<=s.length();i++)
{
int number=Integer.parseInt(s.substring(start,start+i+1));
if(number==0)
{
if(index!=1)
{
sb.append(".");
}
sb.append("0");
help(start+1,index+1);
if(index!=1)
{
sb.delete(sb.length()-2, sb.length());
}
else
{
sb.delete(sb.length()-1, sb.length());
}
break;
}
if(number>255)
{
return;
}
if(index!=1)
{
sb.append(".");
}
sb.append(s.substring(start,start+i+1));
help(start+i+1,index+1);
if(index!=1)
{
sb.delete(sb.length()-2-i, sb.length());
}
else
{
sb.delete(sb.length()-1-i, sb.length());
}
}
}
}
看了别人的代码
public List<String> restoreIpAddresses(String s) {
List<String> list = new ArrayList<>();
if(s == null || s.length() < 4) return list;
search(s, 0, 0, new StringBuilder(), list);
return list;
}
public void search(String s, int index, int count, StringBuilder sb, List<String> list) {
if(count == 4) {
if(index == s.length()) list.add(sb.toString());
return;
}
for(int i=1; i+index<=s.length() && i <= 3; i++) {
int num = Integer.parseInt(s.substring(index, index+i));
if(num >= 0 && num <= 255) {
if(num < 10 && i > 1) return;
StringBuilder newSb = new StringBuilder(sb);
if(count == 0) newSb.append(num);
else newSb.append(".").append(num);
search(s, index+i, count+1, newSb, list);
} else {
return;
}
}
}
他处理0开头的方式是判断数字是两位的时候值是不是小于10.并且这个程序会出现过多的StringBuilder。。虽然程序比我简单,但是,还有优化的地方。