//回溯,深度遍历每个每个按键,然后回溯,题库里的回溯题,都差不多是类似的解法:
public class Solution {
//dfs
public List<String> letterCombinations(String digits) {
List<String>res = new ArrayList<String>();
if(digits.length()==0)return res;
String[] str=new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
dfs(res,"",0,digits,str);
return res;
}
public void dfs(List<String>l,String sb,int index,String m,String[] str)
{
//1
if(index==m.length()&&sb.length()==m.length())//why?
{
l.add(sb);
return;
}
for(int i=index;i<m.length();i++)
{
int a=m.charAt(index)-'0';
for(int j=0;j<str[a].length();j++)
{
sb+=str[a].charAt(j);
dfs(l,sb,i+1,m,str);
sb=sb.substring(0,sb.length()-1);
}
}
}
//2
if(index==m.length())
{
l.add(sb);
return;
}
int a=m.charAt(index)-'0';
for(int j=0;j<str[a].length();j++)
{
sb+=str[a].charAt(j);
dfs(l,sb,index+1,m,str);
sb=sb.substring(0,sb.length()-1);
}
//3
if(index==m.length())
{
l.add(sb.toString());
return;
}
int a=m.charAt(index)-'0';
for(int j=0;j<str[a].length();j++)
{
sb=sb.append(str[a].charAt(j));
dfs(l,sb,index+1,m,str);
sb.setLength(sb.length() - 1);
}
//4 BFS
public List<String> letterCombinations(String digits) {
LinkedList<String>res = new LinkedList<String>();
if(digits.length()==0)return res;
String[] str=new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
res.add("");
if(digits.length()==0)return res;
for(int i=0;i<digits.length();i++)
{
int a=Character.getNumericValue(digits.charAt(i));
while(res.peek().length()==i)
{
String s=res.remove();
for(char c:str[a].toCharArray())
{
res.add(s+c);
}
}
}
return res;
}
}