免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: g9527j
打印 上一主题 下一主题

一個有難度的題目 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-04-07 16:03 |只看该作者
正确的如下:
#include <stdio.h>

int substring(const char *src,char *des);
int isSubString(char *src,char *des);

int main()
{
    char aSrc[]="abcdesdfdfg";
    char aDes[]="\0";
    printf("%d\n",substring(aSrc,aDes));
    return 0;
}

int substring(const char *src,char *des)
{
        if(NULL==src || NULL==des||'\0'==*des)
        {
                return 0;
        }
    int iCount=0;
    char *pcTmp=(char *)src;
    while('\0'!=*pcTmp)
    {
        if(0==isSubString(pcTmp,des))
        {
                iCount++;
        }
        pcTmp++;
    }
    return iCount;
}

int isSubString(char *src,char *des)
{
        if(NULL==src || NULL==des ||'\0'==*des)
        {
                return -1;
        }
    while('\0'!=*des)
    {
        if(*src!=*des)
        {
                return -1;
        }
        src++;
        des++;
    }
    return 0;
}
想了想还是把这个判断放上,可以增加效率

[ 本帖最后由 soul_of_moon 于 2006-4-7 16:09 编辑 ]

论坛徽章:
0
32 [报告]
发表于 2006-04-07 17:22 |只看该作者
我想看看kmp算法,哪位大俠知道。謝謝。
   
soul_of_moon  
正確

论坛徽章:
0
33 [报告]
发表于 2006-04-07 20:26 |只看该作者
char aSrc[]="abbbddfkjkl;j;kjlkj;";
    char aDes[]="bb\0";

    楼上的程序有问题,上面这种情况没有考虑!

论坛徽章:
0
34 [报告]
发表于 2006-04-07 23:19 |只看该作者
大家看看有没有更好的算法,

论坛徽章:
0
35 [报告]
发表于 2006-04-08 01:38 |只看该作者
原帖由 g9527j 于 2006-4-7 17:22 发表
我想看看kmp算法,哪位大俠知道。謝謝。
   
soul_of_moon  
正確


老严的数据结构的书上就有(第二版上 第四章 串)

论坛徽章:
0
36 [报告]
发表于 2006-04-08 10:02 |只看该作者
原帖由 g9527j 于 2006-4-7 23:19 发表
大家看看有没有更好的算法,


我的解答呢?

论坛徽章:
0
37 [报告]
发表于 2006-04-09 03:44 |只看该作者

这种问题就应该删除

任何一本数据结构的书都要讲这个问题,顺序比较或者KMP。楼主这么偷懒来这里套答案,太偷懒了,估计是要(刚)毕业的没有认真学习的学生。太过头了。

论坛徽章:
0
38 [报告]
发表于 2006-04-09 15:58 |只看该作者
其实,如果判断子串个数的话,那么,对于,有重复出现的情况,
如:
母串:"bbbbccbbccbbcbbbb"
子串:"bb"
结果应为多少呢?
有两种可能,一种:8,一种:6
又如:
母串:"abcabcabcaddd"
子串:"abca"
也有两种可能,一种:3,一种:2

到底是那种,要看你目的是做什么的了,
其实,soul_of_moon兄的代码正确的,正是第一种类型,对于重复字符可以在计算,
如果要实现第二种答案:
需要将
int substring(const char *src,char *des)
{
        int iCount=0;
        char *pcTmp=(char *)src;
        while('\0'!=*pcTmp)
        {
                if(0==isSubString(pcTmp,des))
                {
                        iCount++;
                }
                pcTmp++;
        }
        return iCount;
}
改为
int substring(const char *src,char *des)
{
        int iCount=0;
        char *pcTmp=(char *)src;
        while('\0'!=*pcTmp)
        {
                if(0==isSubString(pcTmp,des))
                {
                        iCount++;
                        pcTmp+=strlen(des);
                }
                else
                        pcTmp++;
        }
        return iCount;
}

论坛徽章:
0
39 [报告]
发表于 2006-04-09 17:04 |只看该作者
bitbull ,你好,
你的代码也有问题,

在while(*desp && *srcp++ == *desp++) 这段代码上有问题,
因为后置++事先使用在偏移,所以不对,因改为前置++,
即改为while(*desp && *++srcp == *++desp)

对于在"bbbcbbb"中查找"bb",后置++,为4是错误值,前置++,为2,是正确的

主要原因为:在你循环执行完后,desp可能仍然指向'\0',所以result仍然加一,导致结果不正确

第一次循环,srcp->bbbcbbb,desp->bb, 相等
循环结束时,srcp->bbcbbb,desp->b,
第二次循环,srcp->bbcbbb,desp->b, 相等
循环结束时,srcp->bcbbb,desp->\0,
第三次循环,srcp->bcbbb,desp->bb, 相等
循环结束时,srcp->cbbb,desp->b,
第四次循环,srcp->cbbb,desp->b, 不相等,
退出循环,srcp->bbb,desp->\0,

所以导致,误认为相等,使result+1;

论坛徽章:
0
40 [报告]
发表于 2006-04-09 20:34 |只看该作者
原帖由 xjx79 于 2006-4-9 17:04 发表
bitbull ,你好,
你的代码也有问题,

在while(*desp && *srcp++ == *desp++) 这段代码上有问题,
因为后置++事先使用在偏移,所以不对,因改为前置++,
即改为while(*desp && *++srcp ==  ...


不好意思,代码在从虚拟机抄过来的时候打错了.
我以为我在测试你的bbbcbb的时候结果怎么是正确的.

原代码是前缀++没错.谢谢指出.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP