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);
}
}
}
编程之美--电话号码匹配
最新推荐文章于 2016-07-18 08:37:05 发布