
代码:
class Solution {
public List<String> letterCombinations(String digits) {
int length=digits.length();
List<String> query=new ArrayList<String>();
query.add("0");
query.add("0");
query.add("abc");
query.add("def");
query.add("ghi");
query.add("jkl");
query.add("mno");
query.add("pqrs");
query.add("tuv");
query.add("wxyz");
List<StringBuilder> list=new ArrayList<StringBuilder>();
List<String> result=new ArrayList<String>();
if(digits.equals(""))
return result;
StringBuilder front=new StringBuilder();
func(list,digits,0,front,query);
Iterator<StringBuilder> iter=list.iterator();
while(iter.hasNext()) {
result.add(iter.next().toString());
}
return result;
}
public void func(List<StringBuilder> list,String digits,int n,StringBuilder front,List<String> query) {
int j;
String ad=query.get( digits.charAt(n)-48 );
if(digits.charAt(n)=='7'||digits.charAt(n)=='9')
j=4;
else
j=3;
if(n==digits.length()-1) {
for(int i=0;i<j;i++) {
StringBuilder sb=front.append( ad.charAt(i) );
// list.add(sb);不能用这个,因为这里sb是和front同一个引用,所以待会front删除字符时,sb也删除了,而list里添加的是sb的引用,所以list中的也是删了字符的;所以最好是重新建一个
list.add(new StringBuilder(front));
front=front.deleteCharAt(front.length()-1);
}
}
else{
for(int i=0;i<j;i++) {
front.append(ad.charAt(i));
func(list,digits,n+1,front,query);
front=front.deleteCharAt(front.length()-1);
}
}
}
}
图示:

思想是递归。用蛮力法写多个for循环是不可能的,因为不知道要写几个for循环。以"234"为例:首先进行到a,然后进行到d,然后进行到g(最底层),用一个字符串把前面的字符保留下来,和最后一层拼接,list add一个字符串;然后进行下一次循环和h add一个字符串。也就是说在最底层是for循环 list add 字符串,在其他层是for循环继续递归到下一层。
本文介绍了一种解决电话号码字母组合问题的算法,通过递归方式生成所有可能的字母组合,适用于输入为2到9的数字串。文章详细解释了代码实现过程,包括初始化查询列表、使用StringBuilder进行字符串构建,以及如何避免引用问题。
896

被折叠的 条评论
为什么被折叠?



