已知两个字符串,一个主串S,一个子串T,求子串在主串中是否出现。如果出现,输出子串在主串中的位置。
利用暴力求解算法,每次比较主串和子串中的一个字符是否相等,如果相等,两个串的下标均后移。如果不相等,子串下标回到零,主串下标回到上一次开始比较的下一个位置。也就是说,每匹配失败一次,子串相对主串只移动一个字符的位置。在最好的情况下,该算法的时间复杂度为O(m+n),在最坏的情况下,时间复杂度为O(m*n)。因此,该算法只适合求长度较短的字符串,如果主串和子串过长,很有可能会超时。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int BF(char s[100],char t[10],int m)//m是指从主串下标为m的位置开始进行匹配
{
int i=m,j=0;
int lens=strlen(s),lent=strlen(t);
while(i<lens&&j<lent)
{
if(s[i]==t[j])
{
i++;
j++;
}
else
{
j=0;
i=i-j+2;
}
}
if(j==lent)
{
return i-j;
}
else
return 0;
}
int main()
{
char s[100];
char t[10];
gets(s);
gets(t);
int n;
scanf("%d",&n);
int ans=BF(s,t,n);
if(ans==0)
printf("匹配失败\n");
else
{
printf("%d\n",ans);
}
return 0;
}