如何计算字符矩阵中单词的所有出现次数?
How to count all occurrences of a word in a character matrix?
问题
给定一个 m x n 的二维字符板和一个单词,找出该单词在板上出现的次数。
单词可以由顺序相邻单元格的字母构成,其中相邻单元格水平或垂直相邻。
注意:同一字母单元格不能使用多次。
输入格式
第一行包含两个space分隔的整数m,n分别表示棋盘的行数和列数。
接下来的 m 行每行包含 n 个字符。
最后一行包含要搜索的词。
约束条件
1 <= 米,n <= 5
1 <= lengthOf(word) <= 30
enter code here
输出格式
打印二维板上给定单词的总数。
示例输入
3 4
HDST
ANEO
BENY
NEST // word
示例输出
2
我也无法满足测试用例
5 5
LACOO
OOOCL
NLOOO
ECOCO
MECOO
COOLOOC
输出应该是
28
我的代码
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;
}
}
我认为你的问题是你 return 找到你的话就会打电话。但是,即使您找到了一个词,您仍然想搜索所有其他可能性,因为您搜索的词可能从同一个单元格开始多次出现。
因此,我建议从 dfs 函数中删除布尔值 return,因为如果找到该词,您仍然想搜索其他可能性。我使用您的示例输入测试了以下代码,它似乎有效。
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
语句的顺序,否则您会计算每次出现四次。
问题
给定一个 m x n 的二维字符板和一个单词,找出该单词在板上出现的次数。
单词可以由顺序相邻单元格的字母构成,其中相邻单元格水平或垂直相邻。
注意:同一字母单元格不能使用多次。
输入格式
第一行包含两个space分隔的整数m,n分别表示棋盘的行数和列数。 接下来的 m 行每行包含 n 个字符。 最后一行包含要搜索的词。
约束条件
1 <= 米,n <= 5
1 <= lengthOf(word) <= 30
enter code here
输出格式
打印二维板上给定单词的总数。
示例输入
3 4
HDST
ANEO
BENY
NEST // word
示例输出
2
我也无法满足测试用例
5 5
LACOO
OOOCL
NLOOO
ECOCO
MECOO
COOLOOC
输出应该是
28
我的代码
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;
}
}
我认为你的问题是你 return 找到你的话就会打电话。但是,即使您找到了一个词,您仍然想搜索所有其他可能性,因为您搜索的词可能从同一个单元格开始多次出现。
因此,我建议从 dfs 函数中删除布尔值 return,因为如果找到该词,您仍然想搜索其他可能性。我使用您的示例输入测试了以下代码,它似乎有效。
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
语句的顺序,否则您会计算每次出现四次。