[アルゴリズムブラシ問題] 電話番号の文字の組み合わせに対する非再帰的な解決策

問題: 17. 電話番号の文字の組み合わせ

一連の考え

この質問は DFS と BFS の感覚を感じます。グラフの考え方でやれば良さそうですが、ここにまだコツがあります。DFS と BFS の再帰を比較的簡単な方法で置き換え、反復法が使用され、問題が解決されます。

問題解決法

まず第一に、この問題の部分問題を分解する必要があります。たとえば、ユーザーが 2 を入力した場合、解は ['a', 'b', 'c'] でなければなりません。 a 2 をもとに 3 をすると、表示される結果は 2 をもとに 3 を加えた結果でなければなりません。
したがって、3 の結果が表示された場合は、元の配列を拡張する必要があります。たとえば、 3 の結果は ['d', 'e', 'f'] であり
、最終結果は 3x3 = 9 になるはずです。したがって、配列を len(di_ch[key]) に直接展開できます。ソート後は辞書順に並べられるため、文字列の追加を直接実行したり、キーを介して元の配列を直接変更したりできます。
最終的な時間計算量は O(n^2) ですが、全体的な効果は依然として非常に良好です。

複雑さ

  • 時間計算量:

時間計算量を追加します。例: O ( n 2 ) O(n^2)O ( n2 )

  • 空間の複雑さ:

空間の複雑さを追加します。例: O ( n ) O(n)O ( n )

コード


class Solution:
    di_ch ={
        '2':'abc',
        '3':'def',
        '4':'ghi',
        '5':'jkl',
        '6':'mno',
        '7':'pqrs',
        '8':'tuv',
        '9':'wxyz'
    }

    def solve(self,res,info):
        di_ch = self.di_ch
        if len(res) != 0:
            ori_len = len(res)
            res = res * len(di_ch[info])
            res = sorted(res)

            for index in range(0,len(res)):
                key = index % len(di_ch[info])
                res[index] = res[index] + di_ch[info][key]
        else:
            for item in di_ch[info]:
                res.append(item)
        return res

    def letterCombinations(self, digits: str) -> List[str]:
        res = []
        for item in digits:
	        res = self.solve(res,item)
        return res








        
        

おすすめ

転載: blog.csdn.net/qq_27180763/article/details/129478527