[英]Find the maximum number of times a word appears in a 2D-matrix
给出了一个二维字符网格。 例如,一个 5x4 矩阵如下:
{{'M','O','B','S','N'},
{'M','O','I','L','E'},
{'M','B','I','L','E'},
{'O','B','I','L','E'}}.
我必须使用 Java 找出“MOBILE”这个词在上面的网格中出现的次数。 上面的答案是 3。我只能在 4 个方向上移动,即右、左、上、下。 (不是对角线)。
另一个例子 :
{{'c','a','r'},
{'a','r','c'},
{'c','r','a'}}
这个词是“汽车”。 这个网格的答案是 5。
我知道回溯会有所帮助,但如何?
如果矩阵有 N 个元素,搜索字符串为 k 个字符,矩阵中有 m 个副本:
首先,找到矩阵中字符串第一个字母的所有位置。 在)
然后对于每个找到的位置,对 n-1 个字符进行 4 向扫描。 O(k*m)
最后,汇总所有搜索结果。 欧(米)
以下是我自己问题的解决方案。 我花了一段时间才弄明白。 PS我开发的解决方案忽略了回文的任何可能性。
import java.util.*;
class WOG{
static int m = 0;
static int n = 0;
static int[] x = {0,-1,0,1};
static int[] y = {-1,0,1,0};
public static int func(char[][] grid, int row, int col, String word, int k){
int occ = 0;
if(row>=m || row<0 || col<0 || col>=n)
return 0;
if(grid[row][col]!=word.charAt(k))
return 0;
if(k==word.length()-1)
return 1;
for(int dir=0;dir<4;dir++){
int rd = row+x[dir];
int cd = col+y[dir];
occ += func(grid,rd,cd,word,k+1);
}
return occ;
}
public static int pattern(char[][] grid, String word){
int res = 0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
res += func(grid,i,j,word,0);
}
}
return res;
}
public static void main(String[] args){
char[][] grid2 = {{'m','o','b','s','n'},
{'m','o','i','l','e'},
{'m','b','i','l','e'},
{'o','b','i','l','e'}};
char[][] grid = {{'c','a','r'},
{'a','r','c'},
{'c','r','a'}};
m = 4;
n = 5;
int ans = pattern(grid2,"mobile");
System.out.println(ans);
}
}
我已经使用了递归和回溯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.