码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 17.——Letter Combinations of a Phone Number

时间:2018-03-15 17:58:42      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:post   长度   src   present   hone   元素   完成   app   phone   

  

  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,但是这样就会出现一个问题,那就是如果直接对list里面的字符串操作的话后面又会加上新的,这些新的不好加。而别人的思路就是直接把list里面的拿出来,一个个循环。这里用到了list的peek和remove的区别,peek,取链表第一个元素,但是不删除,remove,取链表第一个元素,但是会删除。remove的是从头remove,而add是从尾add,这样的话新的字符串就都在list后面了,所以可以以list头的字符串长度来作为是否完成一次添加的标准。

 

public static  List<String> letterCombinations(String digits) {
        LinkedList<String> ans = new LinkedList<String>();
        if(digits.isEmpty()) return ans;
        String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        //防止第一个取length空指针
        ans.add("");
        
        for(int i=0;i<digits.length();i++) {
            int x=digits.charAt(i)-48;
            //当头元素长度也满足时表示整个表都满足,因为remove从头,add从尾巴。
            while(ans.peek().length()==i) {
                String t=ans.remove();
                ans.remove(t);
                for(char s:mapping[x].toCharArray()) {
                    ans.add(t+s);
                }
            }
        }
        return ans;
    }

 

Leetcode 17.——Letter Combinations of a Phone Number

标签:post   长度   src   present   hone   元素   完成   app   phone   

原文地址:https://www.cnblogs.com/GoForMyDream/p/8574753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!