欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 17.电话号码的字母组合

程序员文章站 2022-07-01 17:09:47
...

原题内容:

leetcode 17.电话号码的字母组合

分析:

这个题是一个关于排列组合的问题。其他时候的问题都是在让计算有多少种组合情况,用组合计算的公式即可求出答案。但是本题的操作是列举出所有可能,况且如果想要利用多重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.