前几年买的一本数据结构与算法分析的书籍, 偶然看到以前有很多题目没有做, 现在抽空来看一下。
- 题目:输入是由一些字母构成的一个二维数组以及一组单词组成。目标是要找出字谜中的单词, 这些单词可能是水平、垂直或者沿对角线任何方向放置的。
- 思路:首先用广度或者深度都不是一个太理想的方式。因为条件限制, 所以在这里首先将横纵斜以及字符串反向的字符保存, 然后在一一匹配。在时间复杂度上粗略统计也只是平方。
/**
* 解字谜游戏
*/
public class question_1_2 {
static final char[][] c = new char[][]{
{'t', 'h', 'i', 's'},
{'w', 'a', 't', 's'},
{'o', 'a', 'h', 'g'},
{'f', 'g', 'd', 't'}
};
static String[] s = {"this", "two", "fat", "that", "sfgs"};
static int min = c.length;
static List<String> list = new ArrayList<>();
public static void a(int minLength){
for(int i = 0; i < c.length; i++){
char[] v1 = new char[c[i].length];
char[] v2 = new char[c[i].length];
for(int j = 0; j < c[i].length; j++){
v1[j] = c[i][j];
v2[j] = c[j][i];
}
list.add(String.valueOf(v1));
list.add(String.valueOf(v2));
if(i >= minLength - 1){
char[] v3 = new char[i + 1];
char[] v4 = new char[i + 1];
char[] v5 = new char[i + 1];
char[] v6 = new char[i + 1];
int k = 0, l = i, t = c.length - 1;
while(l >= 0){
v3[k] = c[k][l];
v4[k] = c[t][l];
v5[k] = c[l][t];
v6[k] = c[c.length - l - 1][t];
k++;
l--;
t--;
}
b(v3);
b(v4);
b(v5);
b(v6);
}
}
}
public static void b(char[] c){
char[] c2 = new char[c.length];
int j = 0;
for(int i = c.length - 1; i >= 0; i--, j++){
c2[j] = c[i];
}
list.add(String.valueOf(c2));
list.add(String.valueOf(c));
}
public static void main(String[] args){
for (String string : s) {
if(string.length() < min)
min = string.length();
}
a(min);
Set<String> list2 = new TreeSet<>();
for (String str : list) {
for(int i = 0; i < s.length; i++){
if(str.indexOf(s[i]) != -1)
list2.add(s[i]);
}
}
for (String s : list2) {
System.out.print(s + ",");
}
}
}