- 算法思路:暴力破解法,“主串S”与“模式串T”逐位匹配,匹配相同则下一位,匹配相异则回溯。
#include <stdio.h>
#include <string.h>
#define maxsize 100
int Index_BF(char S[],char T[])
{
int i=0,j=0;
while(S[i]!='\0'&&T[j]!='\0')//S[i]=='\0'则为匹配失败,T[i]==‘\0’为匹配成功!
{
if(S[i]==T[j])
{
i++;
j++;
}
else
{
i=i-j+1;//i回溯
j=0;//j回溯
}
}
if(T[j]=='\0')//对应上面循环条件匹配成功
{
printf("Match succeed!\n");
return i-j; //返回第一位的下标
}
else//对应上面循环条件S[i]=='\0'匹配失败
{
printf("Match failed!\n");
return -1;
}
}
int main()
{
char S[maxsize],T[maxsize];
int target;
strcpy(S,"AAAAAAAAAAttract");
strcpy(T,"Attract");
target=Index_BF(S,T);
printf("Position is %d\n",target);
return 0;
}
- 值得一提的是回溯操作,主串S的坐标i回溯也可以不用i=i-j+1;因为主串S每一次都是回溯都是项右推一位坐标,所以设置一指针M,初始M=0,每回溯一次i=++M;即M向后推一位,再让i=M;。
int Index_BF(char S[],char T[])
{
int i=0,j=0,M=0;
while(S[i]!='\0'&&T[j]!='\0')
{
if(S[i]==T[j])
{
i++;
j++;
}
else
{
i=++M;//回溯
j=0;
}
}
if(T[j]=='\0')
{
printf("Match succeed!\n");
return M;//返回M的坐标即可
}
else
{
printf("Match failed!\n");
return -1;
}
}
执行结果: