Swift.字符串的排序

cubegao 2016-01-22 PM 475℃ 0条
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列
例如输入字符串abc,
则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
结果请按字母顺序输出。
import Foundation

class For28Solution {
    func permutation(_ s: String) {
        
        let temp:[Character] = Array(s)
        full_permutation(arr: temp, begin: 0, end: temp.count)
    }
    
    
    // 去重
    func isSwap(arr: [Character], 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: [Character], begin: Int, end: Int) {
        var temp:[Character] = arr
        if begin == end - 1 { // 递归之后输出
            let data:[Character] = Array(arr[0..<end])
            print("排列---\(data)")
        } else {
            for i in begin..<end {
                
                if isSwap(arr: temp, begin: begin, end: i) {
                    temp.swapAt(i, begin) // 字符串交换
                    full_permutation(arr: temp, begin: begin+1, end: end)
                    temp.swapAt(i, begin) // 字符串恢复

                }

            }
        }
    }
}

算法思想:首先,求所有可能出现在第一个位置的字符,
其次,把第一个字符和其后面的字符一一交换。如下图所示,分别把第一个字符a和后面的b、c等字符交换的情形。
接着,固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换

github地址:https://github.com/cubegao/LeetCode

标签: 算法

非特殊说明,本博所有文章均为博主原创。

评论啦~