题目链接https://leetcode.com/problems/letter-combinations-of-a-phone-number/
题目还是蛮有趣的,思路比较直接:使用特定的数据结构将数字2-9到字母的映射保存下来,然后进行组合(combination)就行,组合可以用递归的方法。
因为是组合,每个”数字字符”都含有多个“字母字符”,每次从每个”数字字符”中选择任意一个“字母字符”(选择对象不确定),为保证不重复就按顺序选取:
选择的次数n(数字字符串的长度)也是不确定(由输入决定),很容易想到用n重循环然后来暴力的思维,当然用递归使其简化:
class Solution {
public static char[] symbol1={'a','d','g','j','m','p','t','w'};//起始字母字符
public static int[] number={3,3,3,3,3,4,3,4};//每个键代表的字母字符个数
public static LinkedList<String> ret=new LinkedList<String>();
public static List<String> letterCombinations(String digits) {
ret.clear(); //使用静态变量存储最终结果时一定要清空
if(digits.length()==0)
return ret;
recursion(0,digits,"");
return ret;
}
public static void recursion(int idx,String digits,String s)
{
if(idx>=digits.length())
{
ret.add(s);
return;
}
for(int i=0;i<number[digits.charAt(idx)-'2'];i++)
{
s=s+(char)(symbol1[digits.charAt(idx)-'2']+i);
recursion(idx+1,digits,s);
s=s.substring(0, s.length()-1);//递归调用结束后需要将s去掉一位字母字符以回到递归调用前的状态
}
}
}