LeeCode(バックトラッキング、dfs)17_電話番号の文字の組み合わせ
トピック:
2〜9の数字のみを含む文字列を指定して、それが表すことができるすべての文字の組み合わせを返します。
数字から文字へのマッピングは次のようになります(電話ボタンと同じ)。1はどの文字にも対応しないことに注意してください。
例:
入力: "23"
出力:["ad"、 "ae"、 "af"、 "bd"、 "be"、 "bf"、 "cd"、 "ce"、 "cf"]
説明:
上記にもかかわらず回答は辞書式順序で並べられていますが、回答が出力される順序を選択できます。
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
問題解決のアイデア:
方法1:
バックトラック
まず、ハッシュテーブルを使用して、各番号に対応するすべての可能な文字を格納してから、バックトラッキング操作を実行します。
バックトラッキングプロセス中、既存のアルファベット順を表す文字列が維持されます(電話番号のすべての桁がトラバースされていない場合、既存のアルファベット順は不完全です)。文字列は最初は空です。電話番号の1桁が取得されるたびに、その番号に対応するすべての可能な文字がハッシュテーブルから取得され、既存の文字配置の後に1つの文字が挿入され、電話番号の次の桁が処理されます。電話番号のすべての数字が処理されるまで、完全なアルファベット順が取得されます。次に、ロールバック操作を実行し、残りのアルファベット順をトラバースします。
バックトラッキングアルゴリズムは、すべての実行可能なソリューションを見つけるために使用されます。ソリューションが実行不可能であることが判明した場合、実行不可能なソリューションは破棄されます。この質問では、各番号に対応する各文字が文字の組み合わせを入力する可能性があるため、実行不可能な解決策はなく、すべての解決策を列挙するだけです。
境界線:インデックス== Digits.length()
Javaコード:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class 电话号码的字母组合 {
public List<String> letterCombinations(String digits) {
List<String> combinations = new ArrayList<String>();
if(digits.length() == 0)
return combinations;
Map<Character,String> phoneMap = new HashMap<Character,String>(){
{
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
return combinations;
}
public void backtrack(List<String> combinations,Map<Character,String> phoneMap,
String digits,int index,StringBuffer combination){
//边界
if(index == digits.length()){
combinations.add(combination.toString());
}else{
char digit = digits.charAt(index);
String leletters = phoneMap.get(digit);
int lelettersCount = leletters.length();
for(int i=0;i<lelettersCount;i++){
combination.append(leletters.charAt(i));
backtrack(combinations, phoneMap, digits, index + 1, combination);
combination.deleteCharAt(combination.length()-1);
}
}
}
}