1. 程式人生 > >JAVA 電話號碼組合 遞迴

JAVA 電話號碼組合 遞迴

/電話號碼對應的字元組合:在電話或者手機上,一個數字如2對應著字母ABC,7對應著
PQRS。那麼數字串27所對應的字元的可能組合就有3
4=12種(如AP,BR等)。現在
輸入一個3到11位長的電話號碼,請打印出這個電話號碼所對應的字元的所有可能組合和組合數。
*/

package homework;

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


/*電話號碼對應的字元組合:在電話或者手機上,一個數字如2對應著字母ABC,7對應著
PQRS。那麼數字串27所對應的字元的可能組合就有3*4=12種(如AP,BR等)。現在
輸入一個3到11位長的電話號碼,請打印出這個電話號碼所對應的字元的所有可能組合和組合數。
*/
public class homework3 {
	
	static String[] str= new String[] {"0","1","abc","def",
			"ghi","jkl","mno","pqrs","tuv","wxyz"};//定義每個數字對應的字元
	
	public static void  main(String[] args) {
		System.out.println("請輸入3到11位的電話號碼:");
		Scanner sc=new Scanner(System.in);
		String s=sc.next().toString();//將輸入的數字轉換為字元
		String[] s1 = s.split("");//將輸入的一串數字分離,並賦給陣列s1儲存
		int sum = sum(s1);
		System.out.println("總共有:  "+ sum+"種情況");
		List<String> answer =  letterCombinations( s1,s);
		combination(s, 0, answer);  //呼叫組合函式輸出所有可能的結果
		 System.out.println("可能的組合為:"+answer.toString()+"/n");
	}

	public  static int   sum(String s1[]) {   //計算總共有多少中情況
		  int len = s1.length;
		  int sum = 1;
		for(int i = 0;i<len; i ++) {
			sum *= (str[Integer. valueOf (s1[i])]).length();   //
		}
		return sum;
	}
		static StringBuffer sb = new StringBuffer();
		public static List<String> letterCombinations(String s1[],String s) {
			if (s1.length == 0) {
				return null;
			}
			List<String> answer = new ArrayList<String>();	
			combination(s , 0 , answer);//開始回溯
			return answer;
		}
      public static void combination(String s1,int n, List<String> answer) {
	
    	  
    	  if (n == s1.length()) {
  			answer.add(sb.toString());
  			return;
  		}
    	  for (int i = 0; i < str[s1.charAt(n)-'0'].length(); i++) {
  			sb.append(str[s1.charAt(n)-'0'].charAt(i));
  			combination(s1, n + 1, answer);
  			sb.deleteCharAt(sb.length() - 1);
  		}


}
		
	}