17. Letter Combinations of a Phone Number
集合类的,一看就是back track
只不过子集需要规定一下。
然后好在没有1 0 什么的。。简单了很多
public class Solution {
public List<String> letterCombinations(String digits)
{
List<String> res = new ArrayList<>();
if(digits.length() == 0) return res;
Map<Integer,List<Character>> map = new HashMap<Integer,List<Character>>();
for(char i = '2'; i <= '9';i++) map.put(i - '0',new ArrayList<Character>());
map.get(2).add('a');map.get(2).add('b');map.get(2).add('c');
map.get(3).add('d');map.get(3).add('e');map.get(3).add('f');
map.get(4).add('g');map.get(4).add('h');map.get(4).add('i');
map.get(5).add('j');map.get(5).add('k');map.get(5).add('l');
map.get(6).add('m');map.get(6).add('n');map.get(6).add('o');
map.get(7).add('p');map.get(7).add('q');map.get(7).add('r');map.get(7).add('s');
map.get(8).add('t');map.get(8).add('u');map.get(8).add('v');
map.get(9).add('w');map.get(9).add('x');map.get(9).add('y');map.get(9).add('z');
helper(res,digits,map,new String(),0);
return res;
}
public void helper(List<String> res, String digits, Map<Integer,List<Character>> map, String tempStr,int m)
{
if(m == digits.length())
{
res.add(tempStr);
}
else
{
char tempCh = digits.charAt(m);
List<Character> letterList = map.get(tempCh - '0');
for(int j = 0; j < letterList.size();j++)
{
helper(res,digits,map,tempStr + Character.toString(letterList.get(j)),m+1);
}
}
}
}
我居然蠢到用MAP来规定可用字母。
其实完全可以String[] = new String[9];
String[2] = "abc"
String[3] = "def"
...
甚至String[] cao = {"","abc","def"...}
BACK TRACK没啥可说的。。
三刷。
只有数字的话简单多了,没那些乱七八糟的。
DFS。。
复杂度:
Time: O(3^n)
Space: O(n)
public class Solution {
public List<String> letterCombinations(String digits) {
List<String> res = new ArrayList<>();
if (digits.length() == 0) return res;
String[] strs = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
dfs(res, strs, digits, new String());
return res;
}
public void dfs(List<String> res, String[] strs, String s, String tempS) {
if (s.length() == 0) {
res.add(tempS);
return;
} else {
String letter = strs[s.charAt(0) - '0'];
for (int i = 0; i < letter.length(); i++) {
dfs(res, strs, s.substring(1), tempS + letter.charAt(i));
}
}
}
}