1.分割回文串 leetcode 131
class Solution {
List<List<String>> res = new ArrayList<>();
List<String> temp = new ArrayList<>();
public List<List<String>> partition(String s) {
backtracking(s,0);
return res;
}
public void backtracking(String s,int start){
if(start>=s.length()){
res.add(new ArrayList<>(temp));
return;
}
for(int i=start;i<s.length();i++){
if(isPalindrome(s.substring(start,i+1))){
temp.add(s.substring(start,i+1));
}else{
continue;
}
backtracking(s,i+1);
temp.remove(temp.size()-1);
}
}
public boolean isPalindrome(String s){
int left = 0;
int right = s.length()-1;
while(left<right){
if(s.charAt(left)!=s.charAt(right)){
return false;
}
left++;
right--;
}
return true;
}
}
分割回文串,我们这时传入的start是切割线,比如abc,当start=0时切割:a|bc,当是回文的时候就加入temp,反之则看下一次切割情况。其余的和之前的回溯法没什么区别。
2.复原IP地址 leetcode 93
class Solution {
List<String> res = new ArrayList<>();
StringBuilder sb = new StringBuilder();
public List<String> restoreIpAddresses(String s) {
if(s.length()>12){
return res;
}
backtraceking(s,0,0);
return res;
}
public void backtraceking(String s,int start,int count){
if(start == s.length() && count==4){
res.add(sb.toString());
return;
}
if(start==s.length()||count==4){
return;
}
for(int i=start;i<s.length()&&i-start<3&&Integer.parseInt(s.substring(start,i+1))>=0&&
Integer.parseInt(s.substring(start,i+1))<=255;i++){
if(i+1-start>1&&s.charAt(start)-'0'==0){
continue;
}
sb.append(s.substring(start,i+1));
if(count<3){
sb.append(".");
}
count++;
backtraceking(s,i+1,count);
count--;
sb.delete(start+count,i+count+2);
}
}
}