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();
}
}
};