天天AC系列(三):電話號碼的字母組合

1 題目

Leetcode第17題。
數字2-9映射字母,給出一個包含字符串的數字,列出字母的全部組合。
在這裏插入圖片描述java

2 遞歸

拿到這樣的題目想到了遞歸實現,建立一個Map映射對應的字母,而後把它傳給遞歸函數,同時建立一個臨時變量temp,保存每一次添加字母的結果,遞歸的結束條件是數字串的長度爲0.git

public void one(String digits,List<String> result,HashMap<Integer,String> ss,String temp)
{
    if(digits.length() > 0)
    {
        String s = ss.get((int)(digits.charAt(0))-48);
        for(int i=0;i<s.length();++i)
            one(digits.substring(1),result,ss,temp+s.charAt(i));
    }
    else
        result.add(temp);
}

3 提交

直接一次AC.github

在這裏插入圖片描述

4 優化

其實能夠不須要Map的,能夠直接使用一個字符串數組,由於是數字到字符串的映射,對於數字能夠用下標代替。其次,爲了更快的速度能夠使用StringBuilder代替String.數組

還有就是用下標代替了截斷digits,對於digits其實不必使用截斷,只須要一個下標表示範圍便可,對於StringBuilder,由於沒有像String這樣的+,所以須要在使用append後對其進行刪除處理。app

public void one(String digits,int index,StringBuilder temp)
{
    if(index < digits.length())
    {
        String d = s[digits.charAt(index)-'0'];
        for(int i=0;i<d.length();++i)
        {
            one(digits,index+1,temp.append(d.charAt(i)));
            temp.deleteCharAt(index);
        }
    }
    else
        result.add(temp.toString());
}

在這裏插入圖片描述

5 源碼

github函數

碼雲優化

相關文章
相關標籤/搜索