题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba.
核心代码:
<pre><code>`
// 去重
func isCanSWap(arr:[String],begin:Int,end:Int) -> Bool {
var result:Bool = true
for i in begin..<end {
if arr[i] == arr[end] {
result = false
break
}
}
return result
}
// 字符串特定区间的字符串排列
func full_permutation(arr:[String],begin:Int,end:Int) {
var temp:[String] = arr
if begin == end - 1 { // 递归之后输出
let data:[String] = Array(arr[0..<end])
count += 1
print("排列---\(data)")
} else {
for i in begin..<end {
let result:Bool = isCanSWap(arr: temp, begin: begin, end: i)
if result {
if i != begin {
swap(&temp[i], &temp[begin]) // 字符串交换
}
full_permutation(arr: temp, begin: begin+1, end: end)
if i != begin {
swap(&temp[i], &temp[begin]) // 字符串恢复
}
}
}
}
}`</code></pre>
如果只是abc排列,字符串中没有重复的字母,isCanSwap可以不需要,考虑去重的问题需要加入,假设输入的字符串abb,最终输出的结果只有三种.
测试代码:
<pre><code>`
var arr:[String] = ["a","b","c"]
var permutation:Permutation = Permutation()
permutation.full_permutation(arr: arr, begin: 0, end: arr.count)
print("FlyElephant--(permutation.count)")`</code></pre>