回溯算法(字符串排列)
输入:"aab"
返回值:["aab","aba","baa"]
function Permutation(str)
{
if(!str.length) return []
let res= [];
let used=[];
let dfs = (path="")=> {
if(path.length==str.length) return res.push(path.slice())
for(let i=0;i<str.length;i++) {
if(used[i]) continue
used[i]=true
dfs(path+str.charAt(i));
used[i]=false
}
}
dfs()
// 去掉重复的字符串
return Array.from(new Set(res))
}
括号填充
输入:3
输出:["((()))","(()())","(())()","()(())","()()()"]
function generateParenthesis( n ) {
if(n==0) return []
let res = []
let dfs = (LRemain,RRemain,path) => {
if(path.length==2*n) return res.push(path);
// 当剩余"("大于0时,添加"("
if(LRemain>0) dfs(LRemain-1,RRemain, path+"(")
// 当剩余")"大于剩余"("时,添加")"
if(LRemain<RRemain) dfs(LRemain,RRemain-1, path+")")
}
dfs(n-1,n,"(")
return res
}
解析:括号填充有以下俩特点:
- 左边括号需要先用完,要保证先添加左括号
- 当左括号数量用多了,需要添加右括号,保证右括号后添加
LRemain>0 -> LRemain>0 -> LRemain
LRemain>0 -> LRemain