LeetCode-17. 电话号码的字母组合
示例:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
思路
排列组合的问题,首先需要列出一张和数字一一对应的map表 2-abc 3-def 4-ghi 5-jkl 6-mno 7-pqrs 8-tuv 9-wxyz 对组合模式进行分析,遍历digits字符串,当为2时,有abc ,选择a,其和数字3组合有ad,ae,af。 那么就可以找到逻辑,只需要维护一个已经固定好了头字符a的字符串,然后将他与数字3对应的字符串一一组合,并将他放入结果集中,那么和2中a相关的组合就可以全部列出。 遍历完a之后,将维护逻辑移至b .... 根据这样的思路,有解题步骤:
- 创建一个字符串StringBuild,用以动态维护组合样式
- 遍历原字符串“23”,从头取‘2’,获得2对应的‘abc’
- 将‘abc’遍历,从头取‘a’,将其放入StringBuild,开始排列组合。
- 重复2步骤,下标+1,取‘3’,获取3对应的‘def’
- 将‘def’遍历,从头取‘d’,将其放入StringBuild,判断是否已经完成组合。
- StringBuild.length==disits.length ,代表样式完成,将其中维护的一个组合加入结果集。
- 删除StringBuild当前组合样式,即是步骤5中的‘d’,并且继续进行步骤5中‘def’的遍历,取‘e’
- 重复5->6->7->3
代码
public List<String> letterCombinations(String digits) {
if(digits.length()==0){
return new ArrayList();
}
String [] map=new String[]
{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
List<String> result=new ArrayList<>();
backOrder(result,map,digits,0,new StringBuilder());
return result;
}
public void backOrder(List<String> result,String [] map,String digits,int index,StringBuilder sb){
if(sb.length()==digits.length()){
result.add(sb.toString());
}else{
char c = digits.charAt(index);
String temp=map[c-48]; //ASCII码 '2'-'0' ==2; '0'== 48
for(int i=0;i<temp.length();i++){
sb.append(temp.charAt(i));
backOrder(result,map,digits,index+1,sb);
sb.deleteCharAt(index);
}
}
}
Powered by Waline v2.14.7