解决此问题的一种方法是:
for each path on the board
if corresponding word in dictionary
print it
要查找所有路径,您可以调整任何图遍历算法。
现在这会很慢,因为有很多这样大小的电路板路径(对于具有 n 个单元的电路板,我们最多可以有n * 4 ^ (n - 1)
路径,所以对于 5 x 5 电路板,您将有类似 25 * 2 ^ 50 ~= 10^16 条路径。
对此进行改进的一种方法是交错遍历图形并检查字典,如果当前路径的单词不是字典单词的前缀,则中止:
class Board {
char[][] ch;
boolean[][] visited;
Trie dictionary;
void find() {
StringBuilder prefix = new StringBuilder();
for (int x = 0; x < maxx; x++) {
for (int y = 0; y < maxy; y++) {
walk(x, y, prefix);
}
}
}
void walk(int x, int y, StringBuilder prefix) {
if (!visited[x][y]) {
visited[x][y] = true;
prefix.append(ch[x][y]);
if (dictionary.hasPrefix(prefix)) {
if (dictionary.contains(prefix)) {
System.out.println(prefix);
}
int firstX = Math.max(0, x - 1);
int lastX = Math.min(maxx, x + 1);
int firstY = Math.max(0, y - 1);
int lastY = Math.min(maxy, y + 1);
for (int ax = firstX; ax <= lastX; ax++) {
for (int ay = firstY; ay <= lastY; ay++) {
walk(ax, ay, prefix);
}
}
}
prefix.setLength(prefix.length() - 1);
visited[x][y] = false;
}
}
如您所见,walk 方法会调用自身。这种技术称为递归。
剩下的就是为字典找到支持有效前缀查询的数据结构的问题。最好的这种数据结构是Trie。唉,JDK 不包含实现,但幸运的是,编写一个实现并不难。
注意:此答案中的代码未经测试。