mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-10 20:40:39 +08:00
Leetcode 131(Java): 相同的思路但个人认为更好理解的写法,遵循前两题(combination sum)的格式从而更加易懂,对于cur的使用放弃deque,保持传统仍然使用arraylist
This commit is contained in:
@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user