電話番号電話番号の組み合わせのLeetCode17。手紙の組み合わせ

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;
    }      
}
公開された36元の記事 ウォンの賞賛8 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_32763643/article/details/104346854