S:'abcabcd
P:'abcd'
将s称为主串,p称为子串,在主串中查到子串,如果找到,返回子串在主串中的位置,即下标,如果没有找到,返回-1.
算法一:BF算法(朴素查找算法)
很容易想到的方法是定义两个循环变量,i标记主串,j标记子串,两个变量往后走,进行比较,相等就往后走,不相等的话,主串就返回到原来位置的下一个位置,子串返回到起点,继续比较,如果是子串先比较完了,就说明找到了匹配的,返回子串在主串的位置,如果主串先遍历完,说明主串中没有子串,就返回-1.
这个算法的核心思想就是:i一定要回退,退到原来i的下一个位置,j退到起始位置,然后继续比较。
假设主串的长度为n,子串的长度为m,则时间复杂度:0(n*m)
#include<stdio.h>
#include<string.h>
#include<string.h>
int BFSearch(const char *str,const char *sub,int pos)
{
int lenstr=strlen(str);
int lensub=strlen(sub);
{
int lenstr=strlen(str);
int lensub=strlen(sub);
if(str == NULL || sub== NULL || pos<0 || pos>=lenstr)
{
return -1;
}
{
return -1;
}
int i=pos; //从某个下标开始
int j=0;
int j=0;
while(i<lenstr && j<lensub)//字符匹配
{
if(str [i] == sub[j])//相等的继续往下比较
{
i++;
j++;
}
else//失配
{
i = i-j+1;//原来位置的下一个
j = 0;
}
}
{
if(str [i] == sub[j])//相等的继续往下比较
{
i++;
j++;
}
else//失配
{
i = i-j+1;//原来位置的下一个
j = 0;
}
}
if( j >= lensub)//比较完子串,都是相等的
{
return i-j;//第一个相等的位置
}
else
{
return -1;//比较完主串,返回-1
}
{
return i-j;//第一个相等的位置
}
else
{
return -1;//比较完主串,返回-1
}
}
int main()
{
char *str1="abcaddaf";
char *str2="ad";
printf("%d\n",BFSearch (str1,str2,0));
return 0;
}
int main()
{
char *str1="abcaddaf";
char *str2="ad";
printf("%d\n",BFSearch (str1,str2,0));
return 0;
}