一个不重复字符串,自由组合的种类组合
function f(s) {
var arr = s.split('')
var len = arr.length
var res = []
fn(0)
function fn(i) {
if (i == len - 1) return res.push(arr.join(''))
for (var j = i; j < len; j++) {
swap(i, j, arr)
fn(i + 1)
swap(j, i, arr)
}
}
function swap(i, j, arr) {
if (i == j) return
var mid = arr[i]
arr[i] = arr[j]
arr[j] = mid
}
return res
}
console.log(f('abc'))
可能存在重复的字符串,自由组合的种类
function f(s) {
var arr = s.split('')
var len = arr.length
var res = []
fn(0)
function swap(i, j, arr) {
if (i == j) return
var mid = arr[i]
arr[i] = arr[j]
arr[j] = mid
}
function fn(i) {
if (i == len - 1) return res.push(arr.join(''))
var set = new Set()
for (var j = i; j < len; j++) {
if (set.has(arr[j])) continue
set.add(arr[j])
swap(i, j, arr)
fn(i + 1)
swap(j, i, arr)
}
}
return res
}
f('abc')
对应的leecode面试题是
剑指 Offer 38. 字符串的排列