天真字符串匹配期间比较的字符数

时间:2020-01-19 17:00:15

标签: c string algorithm

我被要求查找在天真字符串匹配期间要比较的字符数。这是我们被要求实现的功能:

// Count the number of characters compared while finding all occurences of the pattern in the given text
// Characters must be matched from left to right
int charactersCompared(char *pattern, char *text);

因此,如果文本为:“ ABCEDF”而模式为:“ EF”,则我将使用蛮力方法比较的字符数为6 (将文本的第一个字母与模式的第一个字母。如果不匹配,请再次将文本的第二个字母与模式的第一个字母进行比较。 如果匹配,则继续比较文本和模式的下一个字母,依此类推)

在弄清了许多示例案例的逻辑之后,我以这种方式实现了上述功能:

int charactersCompared(char *pattern, char *text)
{
    int i,j,comp=0; 
    int flag;

    for(i=0;text[i]!='\0';i++)    //iterating through all the letters of text
    {
        for(j=0;pattern[j]!='\0';j++)
        {
            comp++;             //to count one comparision. 
            if(text[i+j]==pattern[j])   //to check if similar to pattern
            {
                flag=1;          
                continue;
            }
            else
            {
                if(flag==1)
                {
                    flag=0;
                    comp--;
                }
                break;
            }
        }
    }
    //printf("VALUE OF C=%d\n",comp);
    return comp;
}

这对(ABCDEF,EF)对(计数为6)很好,但不适用于其他测试用例,其中包括文本中多次出现模式,例如: 文字:ABCDEFGHEIEF 模式:EF

我应该得到14个比较,而我的输出是12。我不知道我错过了什么地方。

如果任何人都可以指出错误的逻辑是什么,那将有很大的帮助。或者,如果有更简单的方法可以做到这一点,建议表示赞赏。唯一的限制是该方法必须是蛮力方法(即,我无法真正更改比较每个字符串的每个字符的部分)。

谢谢您的时间!

1 个答案:

答案 0 :(得分:1)

请注意,在更坏的情况下是n(m-n+1),其中n是样式的长度,而m是文本的长度。现在,由于您只想计算比较,因此不需要变量flag。首选KISS原则。

for(i=0;text[i]!='\0';i++)    //iterating through all the letters of text
{
    for(j=0;pattern[j]!='\0';j++)
    {
        comp++;             //to count one comparison. 
        if(text[i+j]==pattern[j])   //to check if similar to pattern
            continue;
        break;
     }
}
printf("VALUE OF C=%d\n",comp);