| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 618 人关注过本帖
标题:字符串匹配
只看楼主 加入收藏
赤云
Rank: 2
等 级:论坛游民
帖 子:82
专家分:35
注 册:2014-12-29
结帖率:64.71%
收藏
已结贴  问题点数:10 回复次数:6 
字符串匹配
题目描述
给你一个字符串A和一个字符串B,请你计算字符串B的所有旋转形式在字符串A中的出现总次数。
说明:
如果将字符串B描述成B1B2...Bm的形式(m是B的长度),那么B1B2...Bm-1Bm,B2B3...BmB1,...,BmB1...Bm-2Bm-1就是字符串B的所有旋转形式。
输入
输入包含多组测试数据。每组输入为两行,第一行输入字符串A,第二行输入字符串B。A的长度不超过1000,B的长度不超过100,所有字符串仅包含小写字母。
输出
对于每组输入,输出字符串B的所有旋转形式在字符串A中的出现总次数。
样例输入
abab
ab
aaaa
a
aaaa
aa
样例输出
3
4
3
我的代码:
程序代码:
#include <stdio.h>
#include <string.h>
char a[1005];
int main(){
    char b[105],*p=b,t;
    int i,j,k,m,cnt,lena,lenb,flag;
    while(scanf("%s%s",a,b)!=EOF){
        cnt=0;  flag=1;
        lenb=strlen(b);
        //字符串b中的元素完全相同
        for(i=0;i<lenb-1;i++)
            if(b[i]!=b[i+1])
                flag=0;
        if(flag){
            m=k=0;
            while(m<lenb){
                while(1){
                    p=strstr(&a[k],b);
                    if(p){
                        k+=lenb;
                        cnt++;
                    }
                    else
                        break;
                }
                m++;
                k=m;
            }
            printf("%d\n",cnt);
            continue;
        }
        //字符串b中的元素不完全相同
        i=0;
        while(i<lenb){
            k=0;
            while(1){//此时状态的字符串b,在字符串a中有多少子串
                p=strstr(&a[k],b);
                if(p){
                    cnt++;
                    k=p-&a[0]+1;
                }
                else
                    break;
            }
            i++;
            //反转字符串b
            if(i<lenb){
                t=b[lenb-1];
                for(j=lenb-1;j>=0;j--)
                    b[j]=b[j-1];
                b[0]=t;
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}

为什么答案错误?

下面是给的提交反馈:
测试文件:/test.out   结果:答案错误
 =======原因======
 当参考答案输出:
 901
 -------时---------
 你的程序输出:
 45050
 =================
测试文件:/sample.out   结果:答案正确
搜索更多相关主题的帖子: 字符串 字母 
2015-08-20 16:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:2 
我输入 ababab abab
你竟然输出 6
应该输出 3 吧?!
2015-08-21 08:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:1 
没想出什么好办法(以下代码不好的地方是,计算时修改了a数组,如果a数组是只读的,那么算法就不适用)
程序代码:
#include <stdio.h>
#include <string.h>

int main( void )
{
    char a[1001]; // A的长度不超过1000
    char b[100*2]; // B的长度不超过100
    while( scanf("%s%s",a,b) == 2 )
    {
        size_t an = strlen(a);
        size_t bn = strlen(b);

        // 将b成双
        memcpy( b+bn, b, bn-1 );
        b[2*bn-1] = '\0';

        // 计数
        unsigned count = 0;
        for( size_t i=0; i+bn<=an; ++i )
        {
            char tmp = a[i+bn];
            a[i+bn] = '\0';
            count += (strstr(b,a+i)!=NULL);
            a[i+bn] = tmp;
        }
        printf( "%u\n", count );
    }

    return 0;
}

2015-08-21 09:18
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:3 
程序代码:
#include <stdio.h>
#include <string.h>

int main( void )
{
    char a[1001];
    char b[101];
    while( scanf("%s%s",a,b) == 2 )
    {
        size_t an = strlen(a);
        size_t bn = strlen(b);

        unsigned count = 0;
        for( size_t i=0; i+bn<=an; ++i )
        {
            size_t j = 0;
            for( ; j!=bn && (memcmp(a+i,b+bn-j,j)!=0 || memcmp(a+i+j,b,bn-j)!=0); ++j );
            count += (j!=bn);
        }
        printf( "%u\n", count );
    }

    return 0;
}

2015-08-21 10:55
T_MACC
Rank: 4
等 级:业余侠客
威 望:8
帖 子:99
专家分:211
注 册:2015-4-14
收藏
得分:1 
数据结构里面有一个算法  看看 就会拉
2015-08-21 11:02
moc
Rank: 2
等 级:论坛游民
帖 子:5
专家分:12
注 册:2015-8-20
收藏
得分:3 
程序代码:
#include <stdio.h>
#include <string.h>
#define MAX 1024

int string_match(char*, char*);

int main(){
    char a[MAX];
    char b[MAX];
    int count = 0;

    printf("Input two string : \n");
    while(scanf("%s %s", a, b) != EOF){
        count = string_match(a, b);
        printf("%d\n", count);

        printf("Input two string : \n");
    }

    //printf("a is %s\n", a);
    //printf("b is %s\n", b);
    //printf("%d\n", strlen(a));

    return 0;
}

int string_match(char *s1, char* s2){
    int s1_len, s2_len, tmp, i, count;
    char s3[MAX];

    s1_len = strlen(s1);
    s2_len = strlen(s2);

    if(s2_len > s1)
        return 0;

    for(i=0; i<s2_len; ++i){
       s3[i] = *(s2+s2_len-1-i);
    }

    count = 0;
    tmp = s1_len - s2_len + 1;
    for(i=0; i<tmp; ++i){
        if(strncmp(s1+i, s2, s2_len) == 0 || strncmp(s1+i, s3, s2_len) == 0){
            //printf("index : %d\n", i);
            ++count;
        }
    }

    return count;
}


[ 本帖最后由 moc 于 2015-8-21 11:11 编辑 ]
2015-08-21 11:08
赤云
Rank: 2
等 级:论坛游民
帖 子:82
专家分:35
注 册:2014-12-29
收藏
得分:0 
回复 2楼 rjsp
恩恩,谢谢啦
2015-08-22 09:13
快速回复:字符串匹配
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025808 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved