题17、电话号码的字母组合

一、题目1

在这里插入图片描述

二、思路

循环4n次(n为数字的个数),每一次都将十进制的值转换为4进制的一个长度为n的字符串,这些字符串是不重复的,根据这些字符串就可以和每一个的结果对应,进而得到最终的结果。

另外:因为每个数字对应的字符有三/四个,我为了简单就取大的值4了,所以每次循环得到的结果需要先判断是否是正确的(长度为n)再添加在结果集中。

三、代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class T0017 {

    public static void main(String[] args) {

        String digits = "22ss";

        //String tmp = String.format( "%"+digits.length()+"s", "12" );
        //System.out.println( tmp );

        System.out.println( letterCombinations("22"));      //[aa, ab, ac, ba, bb, bc, ca, cb, cc]

        System.out.println( letterCombinations("7"));
    }

    public static List<String> letterCombinations(String digits) {
        
        List<String> result = new ArrayList<>();        //存储结果,用于输出

        //长度为零时直接输出空
        if ( digits.length() == 0 )
            return result;

        //字典,存储每个数字对于的几个结果
        Map<String, Map<String, String>> dir = new HashMap<>();

        Map<String, String> dir2 = new HashMap<>();
        Map<String, String> dir3 = new HashMap<>();
        Map<String, String> dir4 = new HashMap<>();
        Map<String, String> dir5 = new HashMap<>();
        Map<String, String> dir6 = new HashMap<>();
        Map<String, String> dir7 = new HashMap<>();
        Map<String, String> dir8 = new HashMap<>();
        Map<String, String> dir9 = new HashMap<>();

        dir2.put("0", "a");
        dir2.put("1", "b");
        dir2.put("2", "c");
        dir2.put("3", "");

        dir3.put("0", "d");
        dir3.put("1", "e");
        dir3.put("2", "f");
        dir3.put("3", "");

        dir4.put("0", "g");
        dir4.put("1", "h");
        dir4.put("2", "i");
        dir4.put("3", "");

        dir5.put("0", "j");
        dir5.put("1", "k");
        dir5.put("2", "l");
        dir5.put("3", "");

        dir6.put("0", "m");
        dir6.put("1", "n");
        dir6.put("2", "o");
        dir6.put("3", "");

        dir7.put("0", "p");
        dir7.put("1", "q");
        dir7.put("2", "r");
        dir7.put("3", "s");

        dir8.put("0", "t");
        dir8.put("1", "u");
        dir8.put("2", "v");
        dir8.put("3", "");

        dir9.put("0", "w");
        dir9.put("1", "x");
        dir9.put("2", "y");
        dir9.put("3", "z");

        dir.put("2", dir2);
        dir.put("3", dir3);
        dir.put("4", dir4);
        dir.put("5", dir5);
        dir.put("6", dir6);
        dir.put("7", dir7);
        dir.put("8", dir8);
        dir.put("9", dir9);

        //循环4的digits.length()次幂,排除其中多余的结果,得到正确的
        for ( int i = 0; i < Math.pow(4, digits.length()); i++ ){
            
            //将i转化为4进制的数,并将字符串的长度匹配为digits.length()
            String tmp = String.format( "%"+digits.length()+"s", Integer.toString(i, 4) );
           // System.out.println( tmp );

            String output = "";     //本次结果
            
            //根据tmp的字符,通过字典转化为结果
            for ( int j = 0; j < digits.length(); j++ ){
                output+=dir.get( digits.charAt(j)+"" ).get( tmp.charAt(j) == ' ' ? "0": tmp.charAt(j) +"");
            }

            //判断得到的结果是否合法
            if ( output.length() == digits.length() )
                result.add(output);
        }
        
        return result;
    }
}


  1. 来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎

发布了48 篇原创文章 · 获赞 1 · 访问量 854

猜你喜欢

转载自blog.csdn.net/weixin_45980031/article/details/104145702