算法记录
LeetCode 题目:
给定一个字符串 s ,请将 s 分割成一些子串,使每个子串都是 回文串 ,返回 s 所有可能的分割方案。
说明
一、题目
回文串 是正着读和反着读都一样的字符串。
二、分析
- 需要在当前已经成立的情况下去继续的寻找字串的结果,也就是递归回溯问题。
- 在遇到字符串的结尾位置时进行一次遍历保存即可。
- 题目中出现的字符全是小写字母也就是简化了回文串的判断。
class Solution {
private List<List<String>> ans = new ArrayList();
public String[][] partition(String s) {
LinkedList<String> tem = new LinkedList();
dfs(tem, s, 0, s.length());
String[][] res = new String[ans.size()][];
for(int i = 0; i < ans.size(); i++) {
res[i] = ans.get(i).toArray(new String[0]);
}
return res;
}
private void dfs(LinkedList<String> tem, String s, int start, int end) {
if(start == end) {
ans.add(new ArrayList(tem));
return;
}
for(int i = start; i < end; i++) {
if (isPalindrome(s.substring(start, i + 1))) {
tem.add(s.substring(start, i + 1));
dfs(tem, s, i + 1, end);
tem.remove(tem.size() - 1);
}
}
}
private boolean isPalindrome(String s) {
if(s.length() == 1) return true;
for(int i = 0, j = s.length() - 1; i < j; i++, j--) {
if(s.charAt(i) != s.charAt(j)) return false;
}
return true;
}
}
总结
熟悉深度优先搜索的方程定义。