分割回文串 LeetCode 131
题目链接:[LeetCode 701 - 中等]
思路
回溯中的分割问题: 按照题目的意思,首先得判断是否为回文串,然后进行回溯。
回溯:
class Solution {
List<List<String>> result = new ArrayList<>();
List<String> res = new LinkedList<>();
public List<List<String>> partition(String s) {
backtracking(s,0);
return result;
}
private void backtracking(String s,int index){
if(index >= s.length()){
result.add(new ArrayList(res));
return;
}
for(int i=index;i<s.length();i++){
if(isPalidrome(s,index,i)){
String str = s.substring(index,i+1);
res.addLast(str);
}else{
continue;
}
backtracking(s,i+1);
res.removeLast();
}
}
private boolean isPalidrome(String s,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
if(s.charAt(i)!=s.charAt(j))return false;
}
return true;
}
}
复原 IP 地址 LeetCode 93
题目链接:[LeetCode 93 - 中等]
思路
该题需要实现两个:验证是否合法+回溯 一些技巧:①char的值转化为int:s.charAt(i)-'0'②不使用stringbuilder:s = s.substring(0,i+1) + "." + s.substring(i+1);
回溯:
class Solution {
List<String> result = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
backtracking(s,0,0);
return result;
}
private void backtracking(String s,int startIndex,int numPoint){
if(numPoint == 3){
if(isValid(s,startIndex,s.length()-1)){
result.add(s);
}
}
for(int i=startIndex;i<s.length();i++){
if(isValid(s,startIndex,i)){
numPoint++;
s = s.substring(0,i+1) + "." + s.substring(i+1);
backtracking(s,i+2,numPoint);
numPoint--;
s = s.substring(0,i+1) + s.substring(i+2);
}
}
}
private boolean isValid(String s,int start,int end){
if(start > end)return false;
if(s.charAt(start)=='0'&& start!=end){
return false;
}
int num = 0;
for(int i=start;i<=end;i++){
if(s.charAt(i)>'9' || s.charAt(i)<'0')return false;
num = num*10 + (s.charAt(i)-'0');
if(num > 255){
return false;
}
}
return true;
}
}