leetcode:電話號碼的字母組合回溯法java
阿新 • • 發佈:2018-12-20
大牛們第一次用回溯,寫前幾天剛看了,有問題謝謝幫指出。謝謝你們的支援!
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")); } }