思路
组合问题是选位置不同的数,分割问题是选位置不同的缝插进去,都是找位置,本质是相同的
力扣题目 131.分割回文串
错误的解法(可以自己debug一下,就知道错在哪里)
class Solution {
List<String> result = new ArrayList<>();
List<List<String> > ans = new ArrayList<>();
public List<List<String>> partition(String s) {
backTracking(s,0);
return ans;
}
private void backTracking(String s,int startIndex){
if(startIndex >= s.length()){
//收集结果集————终止条件
ans.add(result);
return;
}
//单层运行的逻辑
for(int i=startIndex; i<s.length(); i++){
//如果是字符串就要记录
if(isPalindrome(s,startIndex,i)){
//切割字符串
String str = s.substring(startIndex,i+1);
result.add(str);
}else
continue;
backTracking(s,i+1);
}
}
private boolean isPalindrome(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;
}
}
错误分析
为什么错误呢?因为我的result是一个集合,里面的数据元素是累加的,所以在处理结果的时候会发生添加重复的数据元素。
所以解决方法应该是——用队列,每次将数据弹出去。
(即使将result设立为全局变量也无动于衷)
正确的解法
class Solution {
List<List<String> > ans = new ArrayList<>();
Deque<String> result = new LinkedList<>();
public List<List<String>> partition(String s) {
backTracking(s,0);
return ans;
}
private void backTracking(String s,int startIndex){
if(startIndex >= s.length()){
//收集结果集————终止条件
ans.add(new ArrayList(result));
return;
}
//单层运行的逻辑
for(int i=startIndex; i<s.length(); i++){
//如果是字符串就要记录
if(isPalindrome(s,startIndex,i)){
//切割字符串
String str = s.substring(startIndex,i+1);
result.add(str);
}else
continue;
backTracking(s,i+1);
//这里记得要pollLast才行
result.pollLast();
}
}
private boolean isPalindrome(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;
}
}
牛比的大神可以做N皇后与解数独的题,小弟能力不够,到此为止,等我二刷再说