编程之美--电话号码匹配

package structure;

public class TelNumber {

    /**
     * 给你一个电话号码,显示出该电话号码可以组成的所有单词
     */
    static String[] s = { "", // 0
	    "", // 1 0 1 上面都没有字母
	    "abc", // 2
	    "def", // 3
	    "ghi", // 4
	    "jkl", // 5
	    "mno", // 6
	    "pqrs", // 7
	    "tuv", // 8
	    "wxyz" // 9
    };
    static int[] total = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4 };
    static int[] ans = new int[3];
    static int[] tel = { 2, 3, 5 };
    public static void main(String args[]) {
	int n = 3; // 电话有三位
	/*
	// 此种遍历 i j k 可以换成 一个数组
	for (int i = 0; i < s[2].length(); i++)
	    for (int j = 0; j < s[3].length(); j++)
		for (int k = 0; k < s[5].length(); k++) {
		    System.out.printf("%c%c%c", s[2].charAt(i), s[3].charAt(j),
			    s[5].charAt(k));
		    System.out.println();
		}
	// 使用二种遍历
	for(ans[0] = 0;ans[0]<total[tel[0]];ans[0]++)
	    for(ans[1]=0;ans[1]<total[tel[1]];ans[1]++)
		for(ans[2]=0;ans[2]<total[tel[2]];ans[2]++){
		    for(int i=0;i<3;i++)
			System.out.print(s[tel[i]].charAt(ans[i]));
		    System.out.println();
		}
		*/
	back(0);
    }
    /**
     * 就是搜索一个棵树,而且树的结点扩展都知道,也就是 s[i]所表示的字符串都为扩展结点
     * 而我们可以另开辟一个数组来记录当前的值,最后进行输出,但下面的例子不是这样的
     * ans[i] 表示第 i 个电话号码 所表示的字母中的第 j位位置,也就是 第i 个结点所能扩展的位置
     * 这样在最后就能记录出当前一条的记录
     * @param t
     */
    static void back(int t){
	if(t == tel.length){
	    for(int i =0;i<t;i++)
		System.out.printf("%c",s[tel[i]].charAt(ans[i]));
	    System.out.println();
	    return;
	}
	for(ans[t]=0;ans[t]<total[tel[t]];ans[t]++){
	   back(t+1);
	}
    }
}

    原文作者:BOY
    原文地址: https://blog.csdn.net/jiang_bing/article/details/8109001
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞