字符串排列组合,避免for循环嵌套

一个不重复字符串,自由组合的种类组合

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')) // ['abc', 'acb', 'bac', 'bca', 'cba', 'cab']

可能存在重复的字符串,自由组合的种类

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. 字符串的排列

猜你喜欢

转载自blog.csdn.net/formylovetm/article/details/126286839