一个不重复字符串,自由组合的种类组合
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'))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
可能存在重复的字符串,自由组合的种类
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')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
对应的leecode面试题是
剑指 Offer 38. 字符串的排列