Leetcode 131(Java): 相同的思路但个人认为更好理解的写法,遵循前两题(combination sum)的格式从而更加易懂,对于cur的使用放弃deque,保持传统仍然使用arraylist

This commit is contained in:
robotsouper
2024-07-22 08:51:23 -04:00
parent 7c8c3169c3
commit 1c2ac1587f

View File

@ -310,39 +310,35 @@ public:
### Java ### Java
```Java ```Java
class Solution { class Solution {
List<List<String>> lists = new ArrayList<>(); //保持前几题一贯的格式, initialization
Deque<String> deque = new LinkedList<>(); List<List<String>> res = new ArrayList<>();
List<String> cur = new ArrayList<>();
public List<List<String>> partition(String s) { public List<List<String>> partition(String s) {
backTracking(s, 0); backtracking(s, 0, new StringBuilder());
return lists; return res;
} }
private void backtracking(String s, int start, StringBuilder sb){
private void backTracking(String s, int startIndex) { //因为是起始位置一个一个加的所以结束时start一定等于s.length,因为进入backtracking时一定末尾也是回文所以cur是满足条件的
//如果起始位置大于s的大小说明找到了一组分割方案 if (start == s.length()){
if (startIndex >= s.length()) { //注意创建一个新的copy
lists.add(new ArrayList(deque)); res.add(new ArrayList<>(cur));
return; return;
} }
for (int i = startIndex; i < s.length(); i++) { //像前两题一样从前往后搜索如果发现回文进入backtracking,起始位置后移一位循环结束照例移除cur的末位
//如果是回文子串,则记录 for (int i = start; i < s.length(); i++){
if (isPalindrome(s, startIndex, i)) { sb.append(s.charAt(i));
String str = s.substring(startIndex, i + 1); if (check(sb)){
deque.addLast(str); cur.add(sb.toString());
} else { backtracking(s, i + 1, new StringBuilder());
continue; cur.remove(cur.size() -1 );
} }
//起始位置后移,保证不重复
backTracking(s, i + 1);
deque.removeLast();
} }
} }
//判断是否是回文串
private boolean isPalindrome(String s, int startIndex, int end) { //helper method, 检查是否是回文
for (int i = startIndex, j = end; i < j; i++, j--) { private boolean check(StringBuilder sb){
if (s.charAt(i) != s.charAt(j)) { for (int i = 0; i < sb.length()/ 2; i++){
return false; if (sb.charAt(i) != sb.charAt(sb.length() - 1 - i)){return false;}
}
} }
return true; return true;
} }