記事のディレクトリ
17.電話番号の組み合わせ
電話番号の17文字の組み合わせ
数字を含む文字列を考えると2-9
包括的、数は表すことができ、すべての可能な文字の組み合わせを返します。
(ちょうど電話ボタンのような)の文字に数字のマッピングは以下のとおりです。1は、任意の文字にマップされないことに注意してください。
例:
Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
深さ優先探索(DFS)
まず、我々のような2対応ABC、電話のキーパッドのマッピングアレイマップを定義します。これは、添字の数字を用いて表されているので、値は0に設定され、添字1は空の文字列です。
私たちは、深さ優先探索の木を考えることができます。前記数は、ツリー層の長さを表します。そして、特定のレベルのために、全てのノードの値は、層べき数字にマッピングされます。2層の数に対応するデジタル値は、ノードA、B、Cのためであろう。次いで、深さは、トラバースの端に文字列の根元端部に、即ち、トラバース。
class Solution {
private String[] map = {
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
private List<String> result;
public List<String> letterCombinations(String digits) {
result = new ArrayList<>();
if(digits == null || digits.length() == 0){
return result;
}
combineDigits(digits,0,new StringBuilder());
return result;
}
public void combineDigits(String digits,int index,StringBuilder sb){
if(index == digits.length()){
result.add(sb.toString());
return;
}
char c = digits.charAt(index);
String letters = map[c - '0'];
for(int i = 0; i < letters.length(); i++){
combineDigits(digits,index + 1, sb.append(letters.charAt(i)));
sb.deleteCharAt(sb.length() - 1);
}
}
}
直接スプライシング
直接のステッチは、文字列に対応する各番号が前に取得し、スプライシングされ、その後、文字列を更新する、非常に単純なスキャンの数字です。
class Solution {
Map<Character,String[]> digitToLetterMap = new HashMap<>(){{
put('2',new String[]{"a","b","c"});
put('3',new String[]{"d","e","f"});
put('4',new String[]{"g","h","i"});
put('5',new String[]{"j","k","l"});
put('6',new String[]{"m","n","o"});
put('7',new String[]{"p","q","r","s"});
put('8',new String[]{"t","u","v"});
put('9',new String[]{"w","x","y","z"});
}};
private List<String> result;
public List<String> letterCombinations(String digits) {
if(digits==null || digits.length() == 0) {
return new ArrayList();
}
result = Arrays.asList(digitToLetterMap.get(digits.charAt(0)));
int i=1;
while (i<digits.length()){
combineTwoDigits(digitToLetterMap.get(digits.charAt(i)));
i++;
}
return result;
}
private void combineTwoDigits(String[] letters){
List<String> re = new ArrayList<>(result.size() * letters.length);
for(int i=0;i<result.size();i++){
for(int j=0;j<b.length;j++){
StringBuilder sb = new StringBuilder();
sb.append(result.get(i));
sb.append(letters[j]);
re.add(sb.toString());
}
}
result = re;
}
}