Problem

给定一个由字符和单词组成的m x n 2D棋盘,找出该单词在棋盘中出现的次数.

单词可以由连续相邻单元的字母构成,其中相邻单元水平或垂直相邻.

注意:同一个字母单元格不能使用多次.

输入格式

第一行包含两个空格分隔的整数m,n,分别表示电路板中的行数和列数.

约束条件

1<=1m、 n<=n5

1<=长度(单词)<=30

enter code here

输出格式

在二维板上打印给定单词的总数.

Sample Input

3 4
HDST
ANEO
BENY
NEST  // word

Sample Output

2

我也不能满足测试用例

5 5
LACOO 
OOOCL
NLOOO
ECOCO
MECOO
COOLOOC

Output should be

28

My Code

 public static void main(String[] args) {
        int m, n;
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();
        n = sc.nextInt();

        char[][] board = new char[m][n + 1];
        for (int i = 0; i < m; i++) {
            String temp = sc.next();
            board[i] = temp.toCharArray();
        }

        String word = sc.next();

        System.out.print(new Result().countWord(board, word, m, n));
    }

static class Result {
        static boolean[][] visited;
        static int count = 0;

        int countWord(char board[][], String word, int m, int n) {
            visited = new boolean[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (board[i][j] == word.charAt(0)) {
                        if(searchWord(board, word, i, j, m, n, 0))
                            count++;
                    }
                }
            }
            return count;
        }

        static boolean searchWord(char board[][], String word, int i, int j, int m, int n, int index) {
            if (index == word.length()) {
                count++;
                return true;
            }

            if (i < 0 || j < 0 || i >= m || j >= n)
                return false;

            if (visited[i][j] || board[i][j] != word.charAt(index))
                return false;

            visited[i][j] = true;

            if (searchWord(board, word, i - 1, j, m, n, index + 1) ||
                    searchWord(board, word, i + 1, j, m, n, index + 1) ||
                    searchWord(board, word, i, j - 1, m, n, index + 1) ||
                    searchWord(board, word, i, j + 1, m, n, index + 1)) {
                return true;
            }

            visited[i][j] = false;
            return false;
        }
    }

推荐答案

我认为你的问题是,如果你找到了你的promise ,你会回所有的电话.然而,即使你找到了一个词,你仍然希望搜索所有其他可能的词,因为你搜索的词可以从同一个单元格开始出现多次.

因此,我建议从dfs函数中删除布尔返回值,因为如果找到了这个词,您仍然希望搜索其他可能性.我用您的示例输入测试了下面的代码,它似乎有效.

static void searchWord(char board[][], String word, int i, int j, int m, int n, int index) {

    if (i < 0 || j < 0 || i >= m || j >= n)
        return;

    if (visited[i][j] || board[i][j] != word.charAt(index))
        return;

    if (index + 1 == word.length()) {
        count++;
        return;
    }

    visited[i][j] = true;

    searchWord(board, word, i - 1, j, m, n, index + 1);
    searchWord(board, word, i + 1, j, m, n, index + 1);
    searchWord(board, word, i, j - 1, m, n, index + 1);
    searchWord(board, word, i, j + 1, m, n, index + 1);

    visited[i][j] = false;
}

编辑:我还必须改变你if条陈述的顺序,否则你会把每一条陈述数四次.

Java相关问答推荐

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

Select 按位运算序列

使用@MappdSuperClass扩展ParentClass&Won t继承ParentClass属性

流迭代列表<;对象>;上的NoSuchElementException

无法在WebSocket onMessage中捕获错误

当涉及到泛型时,类型推理在Java中是如何工作的?

如何解释Java中for-each循环中对Iterable的强制转换方法引用?

将响应转换为带值的键

如何使用log4j2(Json)记录由";异常引起的所有";?

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

是否有一个Java Future实现可以在池繁忙时在调用者线程中执行?

如何在Record Java中使用isRecord()和RecordComponent[]?

为什么mvn编译生命周期阶段不只是编译已更改的java文件?

在Eclipse中可以使用外部字体吗?

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

无法在Java中获取ElastiCache的AWS CloudWatch指标

如何在Spring Boot中为不同的部署环境管理多个.properties文件?

为什么child-pom会创建一个新版本

在不带instanceof或switch的java中记录模式

在java中使用SevenZip.openArchive方法后无法删除文件