1. 程式人生 > >leetcode:電話號碼的字母組合回溯法java

leetcode:電話號碼的字母組合回溯法java

大牛們第一次用回溯,寫前幾天剛看了,有問題謝謝幫指出。謝謝你們的支援! 

package LeetCode;

import java.util.ArrayList;
import java.util.List;

public class PhoneNumeber {
    static List<List<Character>> res;
    static StringBuffer results =new StringBuffer();;
    static List<String> cc;
    static  List<List<Character>> datas=new ArrayList<>();;
    public List<String> letterCombinations(String digits) {
        res=new ArrayList<>();
        StringBuffer results =new StringBuffer();
        cc=new ArrayList<>();

        /*

        大致的思路:一個數字為一個數組陣列中是長度為三的封裝成List<char[3]>的陣列;
        */
        if(digits.length()<=0){
            return new ArrayList<String>();
        }
        if (datas.size()!=8){
            //首先把相應的數字對應的字母放到相應的陣列中去while就是
        for(int i=0;i<26;){
           List<Character>strings=new ArrayList<>();
            strings.add ((char)(97+i));
            ++i;
            strings.add((char) (97+i));
            ++i;
            strings.add ((char) (97+i));
           ++i;
            if(i==18||i==25){
                strings.add((char) (97+i));
                ++i;
            }
            datas.add(strings);
        }
        }
        //因為是從2開始所有m-2,res為存放相應數字對應的字元陣列放到結果集中
        for(int j=0;j<digits.length();j++){
            int m=digits.charAt(j)-48;
            res.add(datas.get(m-2));
        }
        stringpj(0);
        return cc;


    }

    //回溯法 取值 匹配 並放入到最終結果集中
    public void stringpj(int n) {

        for (int i = 0; i <res.get(n).size() ; i++) {
            if (n == res.size()-1) {
                 cc.add(results.toString()+ res.get(n).get(i) +"");
            } else {

                /*if(n>0&&i!=0){
                  results.deleteCharAt(results.length()-1);
                }*/
                 results.append( res.get(n).get(i) +"" ) ;
                 stringpj(n + 1);

            }
            //新的首位字母比如(“23”)中的af完成後be防止abe出現,開始要把字串初始化
            if (n==0)results=new StringBuffer();
            //每次最後一個迴圈後把字串中的最後一個數據刪除不然會出現(“222”)aac,abaa的問題
            if(n!=0&&i==res.get(n).size()-1&&results.length()!=0)results.deleteCharAt(results.length()-1);
        }

    }

    public static void main(String[] args) {
        PhoneNumeber a=new PhoneNumeber();
       // System.out.println(a.letterCombinations("23"));
      //  System.out.println(a.letterCombinations("2"));
        System.out.println(a.letterCombinations("2345"));
    }
}