一、题目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;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎