IOS 算法(中級篇) ----- 無重復字符串的排列組合

題目: 求無重復字符串的排列組合。(字符都是英文字母且長度在[1, 9]之間)

例:
給定: s = "qwe"
返回:["qwe", "qew", "wqe", "weq", "ewq", "eqw"]

給定: s = "ab"
返回:["ab", "ba"]

解題思路

這個題目比較好的地方是規(guī)定了 字符串每個字符均不相同, 減少了我們很多判斷處理
全排列+交換法, 交換位置之后再遞歸回溯

例如 初始字符串 qwe, 我們定義一個index = 0, 初始數(shù)組, [qwe]

第一輪,數(shù)組每個元素用index 0以上的,跟0做交換,得到:
wqe, eqw 加上初始qwe, 我們得到這樣一個數(shù)組 [qwe, wqe, eqw]

第二輪,新數(shù)組每個元素用index 1以上的,跟1做交換,得到:
qew, weq, ewq, 加上之前那些 得到 [qwe, wqe, eqw, qew, weq, ewq]

show.png

為了便于理解我們再看個例子 初始字符串 JQKA, index = 0, [JQKA]

第一輪,index 0以上的,跟0做交換,得到:
QJKA, KQJA, AQKJ
數(shù)組: [JQKA, QJKA, KQJA, AQKJ]

第二輪,index 1以上的,跟1做交換,得到:
JKQA, JAKQ, QKJA, QAKJ, KJQA, KAJQ, AKQJ, AJKQ

數(shù)組: [JQKA, QJKA, KQJA, AQKJ, JKQA, JAKQ, QKJA, QAKJ, KJQA, KAJQ, AKQJ, AJKQ]

第三輪,index 2以上的,跟2做交換,得到:
JQAK QJAK KQAJ
AQJK JKAQ JAQK
QKAJ QAJK KJAQ
KAQJ AKJQ AJQK

數(shù)組: [JQKA, QJKA, KQJA, AQKJ, JKQA, JAKQ, QKJA, QAKJ, KJQA, KAJQ, AKQJ, AJKQ, JQAK QJAK KQAJ, AQJK JKAQ JAQK, QKAJ QAJK KJAQ, KAQJ AKJQ AJQK]

完成返回

按著這個思路我們可寫算法

    func permutation(_ S: String) -> [String] {
        var index = 0
        var result:[String] = [S]
        while index < S.count {
            for i in 0..<result.count {
                for j in index+1..<result[i].count {
                    let swapStr = swapCharacters(result[i], index, j);
                    result.append(swapStr);
                }
            }
            index+=1;
        }
        return result;
    }
    
    //字符串指定兩個位置字符互換位置方法
    func swapCharacters(_ send: String, _ index1:Int, _ index2:Int) -> String     {
        var characters = Array(send)
        characters.swapAt(index1, index2)
        return String(characters)
    }

題目來源:力扣(LeetCode) 感謝力扣爸爸 :)
IOS 算法合集地址

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容