用bf算法求子串第一次出现在主串的位置。

编写算法,查找模式串t在主串s中第一次出现的位置

输入格式:

首先输入主串s,在第二行中输入模式串t,s和t中不包含空格。

输出格式:

对于每组测试,若模式串t在主串s中出现,则输出t在s中的子串位置,否则输出0。

img


```c
#include
#include
using namespace std;
#define MAX 255
typedef unsigned char SString[MAX+1];
int Index(SString S,SString T,int pos)
{
    int i=pos,j=1;
    while(i<=S[0]&&j<=T[0])
    {
        if(S[i]==T[j])
        {
            i++;
            j++;
        }
        else
        {
            i=i-j+2;
            j=1;    
        }
    }
    if(j>T[0])
        return i-T[0];
    else
        return 0;
}
int main()
{
    SString S,T;
    cin>>S>>T;
    cout<<Index(S,T,1);
    return 0;
}

感觉少了定义数组T[0],S[0]为字符串长度而不存储字符的代码,不知道怎么下手。
运行输出错误 求解,最好能附上修改后的代码,学的太浑噩了,听不懂。

修改如下,供参考:

#include <iostream>
#include <string>     //#include<string.h>
using namespace std;
#define MAX 255
typedef unsigned char SString[MAX + 1];
int Index(SString S, SString T) // , int pos) 修改
{
    int i = 0, j = 0, pos = 0;
    while (S[i] && T[j]) //while (i <= S[0] && j <= T[0]) 修改
    {
        if (S[i] == T[j])
        {
            pos = i;
            while (S[pos] == T[j] && T[j] && S[pos]) pos++, j++; //修改
            if (T[j])  i++, j = 0;                     //修改
        }
        else
        {
            i++;
            j = 0;
            //i = i - j + 2; 修改
            //j = 1;         修改
        }
    }
    if (!T[j])   //if (j > T[0])
        return  i + 1; //i - T[0];
    else
        return 0;
}
int main()
{
    SString S, T;
    cin >> S;    // 修改
    cin >> T;    
    cout << Index(S, T); //, 1);
    return 0;
}

在使用 SString 类型时,需要保证输入字符串的长度不超过 MAX,否则可能会发生数组越界等异常情况。
代码中没有判断输入是否合法,例如空字符串或输入字符串长度为0的情况,这可能导致函数运行出错。
在输出查找结果时,题目要求位置从 1 开始计算,因此我们不能直接将索引值输出,而是需要将其加 1 后再输出。
因此,可以对代码做如下改进:

#include <iostream>
#include <string.h>

using namespace std;

#define MAX 255
typedef unsigned char SString[MAX+1];

int Index(SString S, SString T, int pos) {
    int i = pos, j = 1;
    while (i <= S[0] && j <= T[0]) {
        if (S[i] == T[j]) {
            i++;
            j++;
        } else {
            i = i - j + 2;
            j = 1;    
        }
    }
    if (j > T[0])
        return i - T[0];
    else
        return 0;
}

int main() {
    SString S, T;
    cin >> S >> T;
    if (S[0] == 0 || T[0] == 0) {
        cout << 0 << endl;
        return 0;
    }
    int pos = Index(S, T, 1);
    if (pos)
        cout << pos << endl;
    else
        cout << 0 << endl;
    return 0;
}

改进后的代码会先判断输入是否合法,如果输入字符串长度为 0,则直接输出 0;否则使用修改后的 Index 函数查找模式串在主串中出现的位置,并将结果加 1 后输出。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^