leetcode 17.电话号码的字母组合
程序员文章站
2022-07-01 17:09:47
...
原题内容:
分析:
这个题是一个关于排列组合的问题。其他时候的问题都是在让计算有多少种组合情况,用组合计算的公式即可求出答案。但是本题的操作是列举出所有可能,况且如果想要利用多重for循环并在最里层循环依次增加符合条件的元素,由于不知道按下的数字字符串长度,我们没法确定循环的层数,因此就需要我们采用一些迭代或者递推的方法来求得答案。
方法一
在此方法里面,先检查在给定的字符串digits里面有没有不是2~9这几个数字的字符,存在这样的字符,说明不能找到相应的字母组合,因此就返回空ArrayList。
另外还需要检查字符串digits长度,为0的时候也要返回空ArrayList。
接下来就是常规的递推环节,从一个只有一个空字符串的字符串类型的ArrayList(此list要先加入一个ArrayList类型的ArrayList biao,,,哎呦我去,好绕啊)开始,遍历字符串digits,每轮循环只依次取出一个字符(一个2-9的数字),这个字符对应的子母们要和biao里面最后一个ArrayList里面的所有字符串组合,并把每个结果假如一个新的String类型的ArrayList,完成后的ArrayList也要加入biao里面,最后取出biao里面最后一个ArrayList作为答案。
此方法的java代码如下:
/*
*作者@v7fgg
*执行用时 :7 ms, 在所有 Java 提交中击败了36.76%的用户
*内存消耗 :40 MB, 在所有 Java 提交中击败了5.17%的用户
*2020年6月1日 15:29
*/
class Solution {
public List<String> letterCombinations(String digits) {
List<List<String>> biao=new ArrayList<>();
//用来存放所有前(1-digits.length)位组成的ArrayList们
List<String> ansT=new ArrayList<>();
//用于存放空字符串或者应对特殊情况而需要返回的空list
int l=digits.length();
if(l==0){
return ansT;//注意判断给定的字符串为空,什么都没摁
}
for(int k=0;k<l;k++){
//出现不是2-9的数字就返回空
char s=digits.charAt(k);
if(!(s>='2'&&s<='9')){
return ansT;
}
}
//下面的操作是建立一个ArrayList,里面有前i+1位数字组合所对应的所有字母组合
ansT.add("");
biao.add(ansT);
for(int i=0;i<l;i++){
biao.add(zuhe(biao.get(i),digits.charAt(i)));
}
return biao.get(l);
}
public List<String> zuhe(List<String> str, char c){
//此方法返回的是给定字符串list和下一个按键所组成的新的字符串list
List<String> ans=new ArrayList<>();
String shu="";
switch (c){
case '2':
shu+="abc";
break;
case '3':
shu+="def";
break;
case '4':
shu+="ghi";
break;
case '5':
shu+="jkl";
break;
case '6':
shu+="mno";
break;
case '7':
shu+="pqrs";
break;
case '8':
shu+="tuv";
break;
case '9':
shu+="wxyz";
break;
}
for(String s:str){
for(int i=0;i<shu.length();i++){
ans.add(s+shu.charAt(i));
}
}return ans;
}
}
//on leetcode.com
//Runtime: 5 ms, faster than 41.06% of Java online submissions for Letter Combinations of a Phone Number.
//Memory Usage: 39.8 MB, less than 6.16% of Java online submissions for Letter Combinations of a Phone Number.
上一篇: leetcode 43.字符串相乘