我有这个算法来生成格式正确的括号的所有组合.
有人可以解释算法的核心概念吗?我尝试通过它进行调试,但我仍然无法掌握算法背后的基本概念.
另外,关于如何为这个问题提出这样一个算法的任何一般性建议,即如何通过这种方式如此聪明地解决它,或者为了达到这个阶段必须做什么练习.
问题:
给定
n括号对,编写一个函数来生成格式正确的括号的所有组合.例如,给定n = 3,解决方案集是:Run Code Online (Sandbox Code Playgroud)“((()))”, “(()())”, “(())()”, “()(())”, “()()()”
码:
public ArrayList<String> generateParenthesis(int n) {
ArrayList<String> solutions = new ArrayList<String>();
recursion(n, new String(), solutions);
return solutions;
}
private void recursion(int n, String str, ArrayList<String> sol) {
if(str.length() == 2 * n)
sol.add(str);
else {
int left = 0;
int right = 0;
for(int i = 0; i < str.length(); ++i) {
if(str.charAt(i) == '(')
left++;
if(str.charAt(i) == ')')
right++;
}
if(left …Run Code Online (Sandbox Code Playgroud) 我如何将Set<<Set<String>>var的所有元素添加到ArrayList<<ArrayList<String>>?当然我知道只是添加它们的天真方法.
private static ArrayList<ArrayList<String>> groupAnagrams(ArrayList<String> words){
ArrayList<ArrayList<String>> groupedAnagrams = new ArrayList<>();
AbstractMap<String, String> sortedWords = new HashMap<>();
Set<Set<String>> sameAnagramsSet = new HashSet<>();
for(String word : words){
char[] wordToSort = word.toCharArray();
Arrays.sort(wordToSort);
sortedWords.put(word, new String(wordToSort));
}
for(Map.Entry<String, String> entry: sortedWords.entrySet() ){
Set<String> sameAnagrams = new HashSet<>();
sameAnagrams.add(entry.getKey());
for(Map.Entry<String, String> toCompare : sortedWords.entrySet()){
if(entry.getValue().equals(toCompare.getValue())){
sameAnagrams.add(toCompare.getKey());
}
}
if(sameAnagrams.size()>0){
sameAnagramsSet.add(sameAnagrams);
}
}
//-->this line does not work! return new ArrayList<ArrayList<String>>(sameAnagramsSet);
}
Run Code Online (Sandbox Code Playgroud) public static void isMatchHelper(String input, String pattern, boolean ret){
if(pattern.length() == 0 && input.length() == 0){
ret = true;
}
else if(pattern.length() == 0){
ret = false;
}
else if(input.length() == 0){
ret = true;
}
if(pattern.length() == 0 || input.length() == 0){
return;
}
else if(pattern.charAt(0) == input.charAt(0)){
isMatchHelper(input.substring(1), pattern.substring(1), ret);
}
if(pattern.charAt(0) == '.'){
isMatchHelper(input, pattern.substring(1), ret);
}
if(pattern.charAt(0) == '*'){
if(pattern.length() > 1){
int countMatches = 0;
char compareWith = pattern.charAt(countMatches + 1);
while( countMatches != input.length() …Run Code Online (Sandbox Code Playgroud)