【问题标题】:Searching for a substring in 2d array in C在C中的二维数组中搜索子字符串
【发布时间】:2020-07-27 11:14:19
【问题描述】:

这是在二维数组中搜索子字符串的东西

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。在第 6 点(“K”)counting 变为 1;在第 35 点,它变为 2
  • 每 pmg,在 for(wordcnt = 0;...) 之前插入 counting = 0;
  • 天哪,这是错误的 :(((((((((((()) 非常感谢,所以如果我想让它从右到左搜索,我只需要更改 ` if ( matrix[i][j + wordcnt] == str1[wordcnt]) ` to ` if (matrix[i][j - wordcnt] == str1[wordcnt])` 我是对的吗@CraigEstey @pmg

标签: c arrays matrix substring


【解决方案1】:

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

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

此外,一旦您在内循环中找到匹配项,则无需继续。而且,你可以提前停止外循环

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

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

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

所以,我添加了 jmaxCOLUMN - length

从右到左稍微复杂一些。 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2020-09-27
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多