繁体   English   中英

查找单词在 2D 矩阵中出现的最大次数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM