数字だけ2-9を含む文字列を考えると、それは組み合わせが示されているすべての文字を返すことができます。
(同じ電話キー)、次のように文字にデジタルマップを考えます。注1は任意のアルファベットに対応していません。
例:
入力: "23"
を出力する:. [ "広告"、 " AE"、 "AF"、 "BD"、 "である"、 "BF"、 "CD"、 "CE"、 "CF"]
説明:
上記もののその答えは、辞書式順序に基づいていますが、あなたは答え出力の順序を選択することができます。
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
1.再帰バック追加
入力文字列 digits.toCharArray() 、このバックトラックの結果として現在の位置I、RESを実行するためのバックトラックのパラメータ
クラスソリューション{ リストの<string>結果= 新規のArrayList <> (); 地図 <文字、文字列>マップ= 新しい HashMapの<文字、文字列> (){{ 置く( '2'、 "ABC" ); (置く '3'、 "DEF" )。 置く( '4'、 "GHI" )。 置く( '5'、 "JKL" )。 置く( '6'、 "MNO" )。 プット( '7'、 "PQRS" )。 置く( '8'、 "TUV" )。 置く( '9'、 "WXYZ" ); }}。 パブリック一覧<文字列> letterCombinations(文字列の数字){ IF(digits.length()!= 0 ) バックトラックは(digits.toCharArray()、 0、 "" ); 戻り値の結果; } プライベート ボイドバックトラック(文字 []文字を、int型Iを文字列RES){ IF(chars.length == I){ // Iトラバーサルが完了され、順次デジタル result.add(RES); // 分岐結果が追加されたリストの リターン; } 文字列の文字 = map.getとして(文字[I]); // 英作文を対応する番号取得 のために(int型J = 0; J <letters.length(); J ++ ){ 文字列の文字 = letters.substring(J、J + 1 )。 バックトラック(文字、iは + 1、+ resは手紙) } } }
2.非常に洗練されたキューソリューション
チームと各ブランチ再突入チームの後
パブリックリストの<string> letterCombinations(文字列の数字){ LinkedListの <ストリング> ANS = 新しい LinkedListの<文字列> (); もし(digits.isEmpty())戻りANS; 文字列[]マッピング = 新しい文字列[] { "0"、 "1"、 "ABC"、 "DEF"、 "GHI"、 "JKL"、 "MNO"、 "PQRS"、 "TUV"、 "WXYZ" } ; ans.add( "" ); 以下のために(int型 i = 0; i)は(digits.lengthを<; iは++ ){ int型のx = Character.getNumericValue(digits.charAt(I))。 文字列T = ans.remove()。 用(CHAR :マッピング[X] .toCharArray()S) ans.add(T + S)。 } } 戻りANS。 }