给定字符和单词的2D网格,找到网格中给定单词的所有出现。一个单词可以在所有8个方向上的任意点匹配。如果所有字符在该方向上匹配,则表示在该方向上找到了单词(不是锯齿形)。
这8个方向分别是:水平左,水平右,垂直向上,垂直向下和4个对角线方向。
例子:
Input: grid[][] = {"GEEKSFORGEEKS",
"GEEKSQUIZGEEK",
"IDEQAPRACTICE"};
word = "GEEKS"
Output: pattern found at 0, 0
pattern found at 0, 8
pattern found at 1, 0
Explanation: 'GEEKS' can be found as prefix of
1st 2 rows and suffix of first row
Input: grid[][] = {"GEEKSFORGEEKS",
"GEEKSQUIZGEEK",
"IDEQAPRACTICE"};
word = "EEE"
Output: pattern found at 0, 2
pattern found at 0, 10
pattern found at 2, 2
pattern found at 2, 12
Explanation: EEE can be found in first row
twice at index 2 and index 10
and in second row at 2 and 12
下图显示了一个更大的网格,并且其中包含不同的单词。
资料来源: Microsoft面试问题。
方法:这里使用的想法很简单,我们检查每个单元格。如果单元格具有第一个字符,则我们将逐个尝试从该单元格开始的所有8个方向进行匹配。虽然实现很有趣。我们使用两个数组x []和y []来查找所有8个方向上的下一个动作。
下面是相同的实现:
C++
// C++ programs to search a word in a 2D grid
#include
using namespace std;
// For searching in all 8 direction
int x[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int y[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
// This function searches in
// all 8-direction from point
// (row, col) in grid[][]
bool search2D(char *grid, int row, int col,
string word, int R, int C)
{
// If first character of word doesn't
// match with given starting point in grid.
if (*(grid+row*C+col) != word[0])
return false;
int len = word.length();
// Search word in all 8 directions
// starting from (row, col)
for (int dir = 0; dir < 8; dir++) {
// Initialize starting point
// for current direction
int k, rd = row + x[dir], cd = col + y[dir];
// First character is already checked,
// match remaining characters
for (k = 1; k < len; k++) {
// If out of bound break
if (rd >= R || rd < 0 || cd >= C || cd < 0)
break;
// If not matched, break
if (*(grid+rd*C+cd) != word[k])
break;
// Moving in particular direction
rd += x[dir], cd += y[dir];
}
// If all character matched, then value of k must
// be equal to length of word
if (k == len)
return true;
}
return false;
}
// Searches given word in a given
// matrix in all 8 directions
void patternSearch(char *grid, string word,
int R, int C)
{
// Consider every point as starting
// point and search given word
for (int row = 0; row < R; row++)
for (int col = 0; col < C; col++)
if (search2D(grid, row, col, word, R, C))
cout << "pattern found at "
<< row << ", "
<< col << endl;
}
// Driver program
int main()
{
int R = 3, C = 13;
char grid[R][C] = { "GEEKSFORGEEKS",
"GEEKSQUIZGEEK",
"IDEQAPRACTICE" };
patternSearch((char *)grid, "GEEKS", R, C);
cout << endl;
patternSearch((char *)grid, "EEE", R, C);
return 0;
}
Java
// Java program to search
// a word in a 2D grid
import java.io.*;
import java.util.*;
class GFG {
// Rows and columns in the given grid
static int R, C;
// For searching in all 8 direction
static int[] x = { -1, -1, -1, 0, 0, 1, 1, 1 };
static int[] y = { -1, 0, 1, -1, 1, -1, 0, 1 };
// This function searches in all
// 8-direction from point
// (row, col) in grid[][]
static boolean search2D(char[][] grid, int row,
int col, String word)
{
// If first character of word
// doesn't match with
// given starting point in grid.
if (grid[row][col] != word.charAt(0))
return false;
int len = word.length();
// Search word in all 8 directions
// starting from (row, col)
for (int dir = 0; dir < 8; dir++) {
// Initialize starting point
// for current direction
int k, rd = row + x[dir], cd = col + y[dir];
// First character is already checked,
// match remaining characters
for (k = 1; k < len; k++) {
// If out of bound break
if (rd >= R || rd < 0 || cd >= C || cd < 0)
break;
// If not matched, break
if (grid[rd][cd] != word.charAt(k))
break;
// Moving in particular direction
rd += x[dir];
cd += y[dir];
}
// If all character matched,
// then value of must
// be equal to length of word
if (k == len)
return true;
}
return false;
}
// Searches given word in a given
// matrix in all 8 directions
static void patternSearch(
char[][] grid,
String word)
{
// Consider every point as starting
// point and search given word
for (int row = 0; row < R; row++) {
for (int col = 0; col < C; col++) {
if (search2D(grid, row, col, word))
System.out.println(
"pattern found at " + row + ", " + col);
}
}
}
// Driver code
public static void main(String args[])
{
R = 3;
C = 13;
char[][] grid = { { 'G', 'E', 'E', 'K', 'S', 'F', 'O', 'R', 'G', 'E', 'E', 'K', 'S' },
{ 'G', 'E', 'E', 'K', 'S', 'Q', 'U', 'I', 'Z', 'G', 'E', 'E', 'K' },
{ 'I', 'D', 'E', 'Q', 'A', 'P', 'R', 'A', 'C', 'T', 'I', 'C', 'E' } };
patternSearch(grid, "GEEKS");
System.out.println();
patternSearch(grid, "EEE");
}
}
// This code is contributed by rachana soma
Python3
# Python3 program to search a word in a 2D grid
class GFG:
def __init__(self):
self.R = None
self.C = None
self.dir = [[-1, 0], [1, 0], [1, 1],
[1, -1], [-1, -1], [-1, 1],
[0, 1], [0, -1]]
# This function searches in all 8-direction
# from point(row, col) in grid[][]
def search2D(self, grid, row, col, word):
# If first character of word doesn't match
# with the given starting point in grid.
if grid[row][col] != word[0]:
return False
# Search word in all 8 directions
# starting from (row, col)
for x, y in self.dir:
# Initialize starting point
# for current direction
rd, cd = row + x, col + y
flag = True
# First character is already checked,
# match remaining characters
for k in range(1, len(word)):
# If out of bound or not matched, break
if (0 <= rd
C#
// C# program to search a word in a 2D grid
using System;
class GFG {
// Rows and columns in given grid
static int R, C;
// For searching in all 8 direction
static int[] x = { -1, -1, -1, 0, 0, 1, 1, 1 };
static int[] y = { -1, 0, 1, -1, 1, -1, 0, 1 };
// This function searches in all 8-direction
// from point (row, col) in grid[, ]
static bool search2D(char[, ] grid, int row,
int col, String word)
{
// If first character of word doesn't match
// with given starting point in grid.
if (grid[row, col] != word[0]) {
return false;
}
int len = word.Length;
// Search word in all 8 directions
// starting from (row, col)
for (int dir = 0; dir < 8; dir++) {
// Initialize starting point
// for current direction
int k, rd = row + x[dir], cd = col + y[dir];
// First character is already checked,
// match remaining characters
for (k = 1; k < len; k++) {
// If out of bound break
if (rd >= R || rd < 0 || cd >= C || cd < 0) {
break;
}
// If not matched, break
if (grid[rd, cd] != word[k]) {
break;
}
// Moving in particular direction
rd += x[dir];
cd += y[dir];
}
// If all character matched, then value of k
// must be equal to length of word
if (k == len) {
return true;
}
}
return false;
}
// Searches given word in a given
// matrix in all 8 directions
static void patternSearch(char[, ] grid,
String word)
{
// Consider every point as starting
// point and search given word
for (int row = 0; row < R; row++) {
for (int col = 0; col < C; col++) {
if (search2D(grid, row, col, word)) {
Console.WriteLine("pattern found at " + row + ", " + col);
}
}
}
}
// Driver code
public static void Main(String[] args)
{
R = 3;
C = 13;
char[, ] grid = { { 'G', 'E', 'E', 'K', 'S', 'F', 'O',
'R', 'G', 'E', 'E', 'K', 'S' },
{ 'G', 'E', 'E', 'K', 'S', 'Q', 'U',
'I', 'Z', 'G', 'E', 'E', 'K' },
{ 'I', 'D', 'E', 'Q', 'A', 'P', 'R',
'A', 'C', 'T', 'I', 'C', 'E' } };
patternSearch(grid, "GEEKS");
Console.WriteLine();
patternSearch(grid, "EEE");
}
}
#This code is contributed by Rajput - Ji
输出:
pattern found at 0, 0
pattern found at 0, 8
pattern found at 1, 0
pattern found at 0, 2
pattern found at 0, 10
pattern found at 2, 2
pattern found at 2, 12
复杂度分析:
- 时间复杂度: O(R * C)。
所有单元将在所有8个方向上被访问和遍历,其中R和C是矩阵的一面,因此时间复杂度为O(R * C)。 - 辅助空间: O(1)。
由于不需要额外的空间。