Generate Parentheses
这题和二叉树其实挺像的,因为在每一个位置都只有两种可能 "(" 和 ")".
(1)首先left如果大于0,就一直append left,相当于获得一个有不同长度left (的集合
(2)然后针对每个left,append上相应的right ),相当于获得right)的集合
Palindrome Partitioning
本质上是character subset问题.
(1)这个subset的字母必须达到一定长度才可以
(2)每次加进来的不是一个字母,而是一个substring
(3)必须是palindrome才可以加进来
public class Solution {
public List<List<String>> partition(String s) {
List<List<String>> res = new LinkedList<>();
helper(res, new LinkedList<String>(), s, 0);
return res;
}
private void helper(List<List<String>> res, List<String> tmp, String str, int pos){
if(pos == str.length()){
res.add(new LinkedList<String>(tmp));
return;
}
for(int i = pos; i < str.length(); i++){
String sub = str.substring(pos, i+1);
if(isPalindrome(sub)){
tmp.add(sub);
helper(res, tmp, str, i+1);
tmp.remove(tmp.size()-1);
}
}
}
//本题目本质上和subset没啥区别,只是如果是palindrome的情况下才加进去
private boolean isPalindrome(String s){
int i = 0, j = s.length() - 1;
while(i < j){
if(s.charAt(i) == s.charAt(j)){
i++;
j--;
} else {
return false;
}
}
return true;
}
}