字符串的首尾匹配算法

来源:互联网 发布:java博客网站 编辑:程序博客网 时间:2024/05/17 07:29
问题描述:两个字符串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;
}
                                             
0 0
原创粉丝点击