DFS,用C会更合适一些,用Java就要传很多的引用。在我看来,这个DFS就是递归。
import java.util.ArrayList; import java.util.HashMap; public class Solution { public ArrayList<String> letterCombinations(String digits) { // Start typing your Java solution below // DO NOT write main() function ArrayList<String> ans = new ArrayList<String>(); ArrayList<Character> chars = new ArrayList<Character>(); HashMap<Character, String> map = new HashMap<Character, String>(); init(map); dfs(map, digits, 0, chars, ans); if (ans.size() == 0) ans.add(""); return ans; } private void dfs(HashMap<Character, String> map, String digits, int idx, ArrayList<Character> chars, ArrayList<String> arr) { if (idx >= digits.length()) return; char c = digits.charAt(idx); String s = map.get(c); for (int i = 0; i < s.length(); i++) { if (idx == digits.length() - 1) { chars.add(s.charAt(i)); StringBuilder sb = new StringBuilder(); for (char cc : chars) { sb.append(cc); } arr.add(sb.toString()); chars.remove(chars.size() - 1); } else { chars.add(s.charAt(i)); dfs(map, digits, idx+1, chars, arr); chars.remove(chars.size() - 1); } } } private void init(HashMap<Character, String> map) { map.put('1', ""); map.put('2', "abc"); map.put('3', "def"); map.put('4', "ghi"); map.put('5', "jkl"); map.put('6', "mno"); map.put('7', "pqrs"); map.put('8', "tuv"); map.put('9', "wxyz"); } }
第二刷,这个其实类似于求全排列,适合DFS:
class Solution { public: vector<string> result; vector<string> letterCombinations(string digits) { string mapping[] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; result.clear(); string tmp; makeString(digits, mapping, tmp); return result; } void makeString(const string &digits, string mapping[], string &tmp) { int n = tmp.length(); if (n == digits.length()) { result.push_back(tmp); return; } int idx = digits[n] - '0' - 2; for (int i = 0; i < mapping[idx].length(); i++) { tmp.push_back(mapping[idx][i]); makeString(digits, mapping, tmp); tmp.pop_back(); } } };