leetcode解题方案--017--Letter Combinations of a Phone Number

题目

Given a digit string, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below.

Input:Digit string “23”
Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

分析

我的想法是,应用全排列的思想,将字母依次填进数组中,再转为list。
例如 abc 和de进行全排列,先创建3*2的数组。将数组填充为a a b b c c,第二轮循环将数组填充为ad ae bd be cd ce
这需要 计算出每个字符重复的间隔。


 public static List<String> letterCombinations(String digits) {
        List list = new LinkedList<>();

        String[] aa = new String[] {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        if (digits==null || digits.length() == 0) {
            return list;
        }
        char[] digit = digits.toCharArray();
        int [] inter = new int[digit.length];
        for (int i = digit.length-1; i>=0; i--) {
            if (i == digit.length-1) {
                inter[i] = 1;
            } else {
                inter[i] = inter[i+1]*aa[digit[i+1]-48].length();
            }
        }
        int sum = inter[0] * aa[digit[0] - 48].length();

        StringBuffer[] xx = new StringBuffer[sum];

        for (int i  = 0; i<inter.length;i++) {
            int continu = (int)(inter[i]);
            char[] array = aa[digit[i]-48].toCharArray();
            int arrayIndex = 0;
            for (int index = 0; index<sum;) {
                int tmpContinue = continu;
                if (arrayIndex == array.length) {
                    arrayIndex=0;
                }
                while (tmpContinue-->0) {
                    if (xx[index] == null) {
                        xx[index] = new StringBuffer("");
                    }
                    xx[index] = xx[index].append(array[arrayIndex]);
                    index++;
                }
                arrayIndex++;
            }

        }
        for (int i = 0; i<xx.length;i++) {
            list.add(xx[i].toString());
        }
        return list;
    }

还有一种思想巨巨巨巨巧妙
只有15行代码。就是每读到一个数字把可能的string放进list里,再有下一个数字时,把list里的全部取出,加上现有后缀。再放进去。

public List<String> letterCombinations1(String digits) {
        LinkedList<String> ans = new LinkedList<String>();
        String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        ans.add("");
        for(int i =0; i<digits.length();i++){
            int x = Character.getNumericValue(digits.charAt(i));
            while(ans.peek().length()==i){
                String t = ans.remove();
                for(char s : mapping[x].toCharArray())
                    ans.add(t+s);
            }
        }
        return ans;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值