首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

LeetCode Letter Combinations of a Phone Number:遞歸生成所有組合

     編輯:C++ 入門

題目

給定數字字串(2-9),返回所有可能的字母組合。數字到字母映射同電話鍵盤。例如 "23" → ["ad","ae","af","bd","be","bf","cd","ce","cf"]。

遞歸回溯解法

維護當前組合 path,索引 idx。若 idx == digits.length() 加入結果。否則遍歷當前數字對應的所有字母,加入 path 遞歸,回溯移除。

完整 Java 代碼

class Solution {
    private static final String[] MAP = {
        "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"
    };
    public List letterCombinations(String digits) {
        List res = new ArrayList<>();
        if (digits == null || digits.isEmpty()) return res;
        backtrack(digits, 0, new StringBuilder(), res);
        return res;
    }
    private void backtrack(String digits, int idx, StringBuilder path, List res) {
        if (idx == digits.length()) {
            res.add(path.toString());
            return;
        }
        String letters = MAP[digits.charAt(idx) - '0'];
        for (char c : letters.toCharArray()) {
            path.append(c);
            backtrack(digits, idx+1, path, res);
            path.deleteCharAt(path.length()-1);
        }
    }
}

迭代法(佇列/列表擴展)

public List letterCombinations(String digits) {
    List res = new ArrayList<>();
    if (digits.isEmpty()) return res;
    res.add("");
    for (char d : digits.toCharArray()) {
        List tmp = new ArrayList<>();
        for (String s : res) {
            for (char c : MAP[d-'0'].toCharArray()) {
                tmp.add(s + c);
            }
        }
        res = tmp;
    }
    return res;
}

複雜度

時間 O(4^n * n)(最多 4 字母),空間 O(4^n * n) 存儲結果。遞歸棧深度 O(n)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved