在C中搜索二维数组中的子串



这是用于在2d数组中搜索子字符串的东西

int left_to_rigth(char matrix[ROW][COLUNM], char str1[])
{
int i = 0, j, counting = 0, wordcnt;
int length = computeLength(str1);   //returns legth of string   
int index = -1;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COLUNM; j += 1)
{
if (matrix[i][j] == str1[0])
{
for (wordcnt = 0; wordcnt < length; wordcnt++)
{
if (matrix[i][j + wordcnt] == str1[wordcnt])
{
counting++;
}
}
if (counting == length)
{
index = (i *12) + j;
}
}
}
}
return index;
}

输出:

Enter the string to be searched in the puzzle:
SHOUT
position in the puzzle: 12
PUZZLE(MATRIX)
X  T  Z  M  Q  Y  K  C  E  C  F  H -->0 1 2 3 4 5 6 7 8 9 10 11 
*S  H  O  U  T*  E  X  O  E  A  P  I -->12 13 14 ------------23
X  G  T  L  Q  B  E  L  T  N  F  K
A  I  R  I  D  Z  A  L  L  I  O  D
M  E  I  E  T  Y  S  E  H  R  T  I
A  W  B  R  N  E  T  C  W  O  H  X
N  O  U  I  R  U  Z  T  S  C  C  T
U  D  T  P  E  C  J  I  E  H  R  U
A  L  E  M  C  S  Y  O  N  I  U  R
L  V  *K  E  R  E  M*  N  I  P  H  E
E  A  N  B  U  R  E  J  O  N  C  Y
A  W  I  I  I  J  N  J  R  U  Y  F
D  W  T  N  T  H  E  N  P  J  Y  T
E  Q  L  Z  D  I  L  E  M  M  A  B
R  C  I  T  E  N  G  A  M  T  P  C

因此,函数返回SHOUT的起始点,即12,但当我试图搜索单词KEREM时,它应该给我110,但它返回-1,表示该单词不存在。代码似乎只搜索前3行,之后我输入的每个输入都返回-1。你能帮帮我吗我是个初学者这只是我需要做的第一部分,这样它就可以在每个方向上搜索。我可以写4个单独的函数,如果它们不返回-1,就可以调用它们,但我需要首先让工作

好的,我已经做了一些加速和简化。

不需要单独的counting[至少从左到右和从右到左],因为您可以使用wordidx

此外,一旦你在内环上找到匹配,就没有必要继续。而且,你可以提前停止外环

计算调用外部str1的长度并将length作为参数传递会更快。此外,strlen应该可以正常工作。

从左到右,j不需要一直到COLUMN - 1,因为如果矩阵行上没有足够的空间来满足剩余的字符串长度,则最后N个时隙可以匹配。

此外,这是未定义的行为,因为您将溢出到下一行。这将是无害的[但错误的结果],除了最后一行,您将超越整个矩阵的末尾。

因此,我添加了COLUMN - lengthjmax

从右到左稍显棘手。jmax技巧至关重要。

所以,这里有两个函数[它们编译得很干净,但我没有测试过它们]:

#include <string.h>
#define ROW     10
#define COLUMN  10
int
left_to_right(char matrix[ROW][COLUMN], const char *str1, int length)
{
char *matcur;
int i;
int j;
int wordidx;
int jmax = COLUMN - length;
int index = -1;
jmax += 1;
for (i = 0;  i < ROW;  ++i) {
for (j = 0;  j < jmax;  ++j, ++matcur) {
matcur = &matrix[i][0];
if (matcur[0] != str1[0])
continue;
for (wordidx = 1;  wordidx < length;  ++wordidx) {
if (matcur[wordidx] != str1[wordidx])
break;
}
if (wordidx == length) {
index = (i * COLUMN) + j;
break;
}
}
if (index >= 0)
break;
}
return index;
}
int
right_to_left(char matrix[ROW][COLUMN], const char *str1, int length)
{
const char *matcur;
int i;
int j;
int wordidx;
int jmax = COLUMN - length;
int index = -1;
for (i = 0;  i < ROW;  ++i) {
matcur = &matrix[i][jmax];
for (j = jmax;  j >= 0;  --j, --matcur) {
if (matcur[0] != str1[0])
continue;
for (wordidx = 0;  wordidx < length;  ++wordidx) {
if (matcur[wordidx] != str1[wordidx])
break;
}
if (wordidx == length) {
index = (i * COLUMN) + j;
break;
}
}
if (index >= 0)
break;
}
return index;
}

最新更新