字符串匹配算法试图纠正它

String matching algorithm trying to correct it

本文关键字:匹配算法 字符串      更新时间:2023-10-16

我试图做字符串匹配算法的蛮力方法。但是算法不能正常工作,我得到一个超出边界的索引错误。

这是我的算法

int main() {
 string s = "NOBODY_NOTICED_HIM";
 string pattern="NOT";
 int index = 0;
 for (int i = 0; i < s.size();)
 {
    for (int j = 0; j < pattern.size();)
    {
        if(s[index] == pattern[j])
        {
            j++;
            i++;
        }
        else
        {
            index = i;
                    j = 0;
        }
    }
 }
 cout<<index<<endl;
    return 0;
}
固定版本

修复了越界异常。我不知道这个算法是否适用于不同的字符串

int main() {
 string s = "NOBODY_NOTICED_HIM";
 string pattern="NOT";
 int index = 0;
 int i = 0;
 while( i < s.size())
 {
    i++;
    for (int j = 0; j < pattern.size();)
    {
        if(s[index] == pattern[j])
        {
            index++;
            j++;
            cout<<"i is " <<i << " j is "<<j <<endl;
        }
        else
        {
            index = i;
            break;
        }
    }
 }
 cout<<i<<endl;
    return 0;
}

因为内部for循环有一个条件,当j小于pattern.size()时循环,但您也在主体内增加i。当i超出s.size()的边界时,index也会超出边界,你会得到一个OutOfBounds错误。

暴力破解方法必须用每个可能的子序列测试模式。主要条件是长度,长度必须相同。s的所有子序列为:

[‘大人物’,‘鄂博’,‘人’,‘这里’,‘DY_’,"推出",没有,‘不’,‘OTI’,抽搐,'ICE', 'CED', 'ED ', 'D_H', '_HI', 'HIM']

有很多方法可以做到,你可以一个字符一个字符地做,或者使用字符串操作,比如接受子字符串。都是很好的学习练习。

从s字符串的0开始,取前三个字符,与模式比较,如果相等,则给出答案。否则继续移动到从1开始的字符,等等。