Boyer-Moore-坏字符规则实现子字符串搜索

Boyer Moore - Bad character rule implementation substring search

本文关键字:字符串 搜索 实现 规则 字符 Boyer-Moore-      更新时间:2023-10-16

我正试图用2D数组从boyer moore中实现坏字符规则,用于子字符串搜索,我遇到了这样的场景:我看到我的arr[0]与arr[1][0]重叠,这导致了问题。我试着浏览VS中的代码,如果我查看内存位置,它实际上显示了正确的值,但在打印时我不确定这种重叠是如何发生的。有人能帮我理解我做错了什么吗?

错误输出j的值为---0

新条目是---f 102 13

内部while循环--102 13

内部while循环--13-1//13的重叠是否发生y

 # define ROWS 20
  # define COLUMNS 1
 int main(void)
    {
        string str = "firstcharacter";
        int strlength = str.length();
        int arr[ROWS][COLUMNS];
        memset(arr, -1, sizeof(arr[0][0]) * ROWS * COLUMNS);
        for (int i = 0; i < strlength; i++)
        {
            int j = 0;
            bool flag = false;
            // check till point previous character was inserted
            while (arr[j][1] != -1)
            {
                // if previous character is already present 
                // just update value dont insert character
                if (arr[j][0] == str[i])
                {
                    flag = true;
                    break;
                }
                j++;
            }
            if (flag == true)
            {
                int value = strlength - i - 1;
                arr[j][1] = value;
                cout << " Old entry is  --- " << str[i] << "  " << arr[j][0] << "     " << arr[j][1] << endl << endl;
            }
            else
            {
                int value = strlength - i - 1;
                arr[j][0] = str[i];
                arr[j][1] = value;
                cout << " New entry is  --- " << str[i] << "  "<< arr[j][0] << "     " << arr[j][1] << endl << endl;
            }   
            for (int x = 0; x < strlength; x++)
            {
                cout << " Inside while loop --  " << arr[x][0] << "     " << arr[x][1] << endl;      // --- error case after first iteration only I see value overlapping
            }
        }
        cout << endl << endl << endl << endl;
        for (int i = 0; i < strlength; i++)
        {
            cout << " final table is " << arr[i][0] << "     " << arr[i][1] << endl;
        }
        return 0;
    }

因为COLUMNS就是1ary[j][1]ary[j+1][0]将指向相同的内存地址,尽管第一个在技术上是未定义的行为,因为[1]下标超出范围,