一連の考え
この質問は 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