问题描述:两个字符串s,t 判断t是否为s的子串。
算法过程:s[i]==t[j]时,比较t的尾部和对应的s的元素,然后首尾并进
直到首尾相遇
代码:
/**********字符串首尾匹配算法************/
/*如果字符串t和字符串s相等那么 互为子/主串**/
#include<stdio.h>
#define MAXSIZE 10005
int com_string(char *s,char *t,int s_len,int t_len)
{
if(t_len>s_len)return 0;
//i是主串s每次递进1的 j是子串t递进的 k是当s[i]==t[j]时代替i递进的(=i++)
int i,j,k;
i=j=k=0;
int count_t=t_len;//记录字串的长度-1
//如果主串剩下的长度少于子串 匹配失败
while((s_len-i)>=t_len)
{
//子串的首元素和主串逐一比较 如果相等再次比较子串的尾元素和主串对应的元素
//如果还是相等则子串首尾元素并进向中间靠拢 和子串对应的主串部分也是
if(s[i+k]==t[j]&&s[i+count_t]==t[count_t])
{
//字符串的长度是奇数还是偶数对应的两种不同情况
if(j==count_t||((count_t-1)==j)) return 1;
k++;
j++;
count_t--;
}
//字符不相等的话继续主串的下一个元素 同时子串返回原来的状态
else {i++;j=0;count_t=t_len;k=0;}
}
return 0;
}
int main(void)
{
char str_s[MAXSIZE],str_t[MAXSIZE];
int N,i,count_s,count_t;
scanf("%d",&N);//测试用例个数
for(i=0;i<N;i++)
{
scanf("%s",str_s);//主串
scanf("%s",str_t);//子串
//如果是空串的话count_s=-1,否则=最后一个字符下标;
count_s=0;
while(str_s[count_s]!='\0')
count_s++;
count_s--;
count_t=0;
while(str_t[count_t]!='\0')
count_t++;
count_t--;
if(com_string(str_s,str_t,count_s,count_t)==1)
puts("yes");
else puts("no");
}
return 0;
}