题目:
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given "25525511135"
,
return ["255.255.11.135", "255.255.111.35"]
. (Order does not matter)
思路:backtrack
记录当前string,剩下的string,和还需要切分的块数。
每次切分,subString(0,index) 切割长度小于等于3,或者(当剩下的string长度小于3)整个剩下的string。
只有当切割出来的string符合条件:1:0和255之间; 2. 如果开头是0,则切割长度只能是1
代码:
public class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> list = new ArrayList<>();
backTrack(list,"", s, 4);
return list;
}
private void backTrack(List<String> list,String cur, String remain,int n){
if(n==1){
if(remain.length()>3)
return;
if(remain.length()>1&&remain.startsWith("0"))
return;
int remainInt = Integer.parseInt(remain);
if((remainInt>=1&&remainInt<=255)||
(remainInt==0&&remain.length()==1)){
list.add(cur+remain);
}
return;
}
int count =1;
int remainLen = remain.length();
while(remainLen>1&&count<=3){
String cut = remain.substring(0,count);
int cutInt = Integer.parseInt(cut);
if(cutInt>255||(cut.length()>1&&cut.startsWith("0")))
break;
backTrack(list, cur+cut+".", remain.substring(count), n-1);
remainLen--;count++;
}
}
}
代码2:
public class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> list = new ArrayList<>();
backTrack(list,"", s, 4);
return list;
}
private void backTrack(List<String> list,String cur, String remain,int n){
if(n==0){
if(remain.length()==0)
list.add(cur.substring(0,cur.length()-1));
return;
}
int count =1;
int remainLen = remain.length();
while(remainLen>0&&count<=3){
String cut = remain.substring(0,count);
int cutInt = Integer.parseInt(cut);
if(cutInt>255||(cut.length()>1&&cut.startsWith("0")))
break;
backTrack(list, cur+cut+".", remain.substring(count), n-1);
remainLen--;count++;
}
}
}
经典的回溯问题。