Java中字符数组中所有可能的字符串组合

Java中字符数组中所有可能的字符串组合,java,arrays,char,combinations,Java,Arrays,Char,Combinations,我有一个关于Java的学校项目,我也被分配了。现在我对项目的一部分有个问题,我想不出来。 应用程序必须从二维字符数组(char[]]板)生成所有可能的单词组合(可通过字典验证)。电路板是动态的,因为用户可以选择比例:4x4、5x5、4x5、5x4、4x6。。。所以我猜嵌套循环在这里不合适,如果我错了,请纠正我。单词必须水平、垂直和对角生成。4x4电路板示例: |u|a|u|s| |n | n | i | i| |a | o | e | b| |e | u | e | z| Code wa

我有一个关于Java的学校项目,我也被分配了。现在我对项目的一部分有个问题,我想不出来。 应用程序必须从二维字符数组(char[]]板)生成所有可能的单词组合(可通过字典验证)。电路板是动态的,因为用户可以选择比例:4x4、5x5、4x5、5x4、4x6。。。所以我猜嵌套循环在这里不合适,如果我错了,请纠正我。单词必须水平、垂直和对角生成。4x4电路板示例:

|u|a|u|s|

|n | n | i | i|

|a | o | e | b|

|e | u | e | z|

    Code was completely wrong.
另一个想法可能是对电路板上所有可能的路径进行暴力,然后尝试保存的路径来验证它是否是一个单词


提前谢谢

一个相当简单的概念化方法是对每个位置应用(BFS)方法(或深度优先,取决于您以后可能要进行的调整)。这将为您提供所有可能的字母组合,最大字符级别等于搜索的最大深度。根据您的要求,例如允许的最长单词、最长运行时间,如果字典是通过数据结构或文件提供的,则这可能是关键部分


或者,您可能需要进行更多的优化。如果是这样,考虑如何加快BFS或DFS。如果你做了一个DFS,但知道其中的三个字符,没有以“zzz”开头的单词,那会怎么样?不必遍历所有可能的顺序,您可以节省大量时间。为了有效地查找单词,您可能需要做进一步的调整。但我会从Java的内置功能(本例中会想到String.startsWith())开始,测量性能(可能使用有限的最大字长),然后优化何时何地需要它。

解决这一问题的一种方法是:

for each path on the board
    if corresponding word in dictionary
        print it
要找到所有路径,您可以调整任何路径

现在这会非常慢,因为有很多这样大小的电路板的路径(对于一个有n个单元的电路板,我们最多可以有
n*4^(n-1)
路径,所以对于一个5乘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;
        }
    }
课程板{
char[][]ch;
访问的布尔值[];
Trie字典;
void find(){
StringBuilder前缀=新的StringBuilder();
对于(int x=0;x对于(int ax=firstX;ax首先使用简单的重复方法将行、列和对角线转换为字符串。然后,我会将其转换为StringBuilder,或者为了检查哪些单词是真实的,并消除那些不是直接从StringBuilder生成的单词。然后,只需将其打印为字符串。有很多有用的工具可以消除或删除替换java中的单词。

在板上生成单词是什么意思?您的输入是什么,期望的输出是什么?应用程序在随机基础上生成一个板(带有随机字符),然后必须在多个方向(水平、垂直和对角)上找到板上所有可能的单词“在多个方向”是什么意思?一个单词可以使用多个方向,也就是说,这个单词必须在一条直线上,还是可以在一块板上弯曲?所有可能的方向,一次光标(比方说)从那里选择一个字符,它可以跳转到它的所有邻居,等等…它可以跳转到的实际方向保存在HashMap NeiguringCoords中;我现在有一个类似的递归方法:私有void findWord(Woord-Woord,int-positionInWord,Point-currentPosition,HashSet-visited,StringBuilder-currentWoord){…}它是有效的,但有时会产生一些不寻常的结果,比如没有连接的字符等等。。。