Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2349710
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:05:48

/*
你太过讲了,其实我的水平很一般的,距离高手还差得太远了。

学习过指针、数组和循环已经可以完成这个题目了,不需要其它的知识。只不过这里可能有一些让人头痛的算法,所以实现起来有点困难。

我再把我的思路修改一下,就是先找到最短的字符串,然后由长到短取它的子串,去其它字符串中去找这个子串,如果都找到了那么它就是最长的公共子串了。

我编写了一个,你可以看看。你也可以把你的思路跟我说说,我们交流一下,看看实现方便不方便。
*/

#include
#include
#include
#include

#define N 10

int main(void)
{
    unsigned int i,j,k,l;
    unsigned int m,n;
    unsigned int len;
    bool find=false;
    char str[N][255],s[255];

    cout<<"输入字符串的个数:";
    cin>>n;
    getchar();

    //这个循环完成输入各个字符串
    for(i=0;i    {
        cout<<"输入字符串"<        gets(str[i]);
    }

    //把第一个字符串的长度和位置赋值给len和m
    len=strlen(str[0]);
    m=0;

    //这个循环完成找到最短的字符串的长度和位置
    for(i=1;i        if(len>strlen(str[i]))
        {
            len=strlen(str[i]);
            m=i;
        }

    //程序的主要算法,完成的是取最短的字符串的所有子串(由长到短),并到其它字符串中寻找
    for(i=0;i    {
        if(find)  //如果找到了,由于是由长到短求子串,那么找到的就是最长的,跳出循环
            break;

        for(j=0;j<=i;j++)
        {
            l=0;

            //找到子串并赋值给数组s[]
            for(k=j;k                s[l++]=str[m][k];
            s[l]='\0';

            //在其它字符串中寻找s
            for(k=0;k                if(strstr(str[k],s)==NULL)
                    break;

            //如果找到了,那么s[]就是最长的公共字符串
            if(k==n)
            {
                if(!find)
                    cout<<"最长的公共子串为:"<                cout<                find=true;
                //这里没有break,因为可能最长的字符串不止一个
            }
        }
    }
    if(!find)
        cout<<"没有公共子串!"<
    system("Pause");
    return 0;
}

--------------------next---------------------
首先,我说的不是gets,而是getchar(),我前面说的是getchar()这句话有点问题,不过既然Dev C++没有错误我们就不再讨论这个问题了,因为我还没有找到在Visual C++和C++Builder中都可以的方法。

然后解释一下strstr函数。
原型:extern char *strstr(char *haystack, char *needle);
用法:#include
功能:从字符串haystack中寻找needle第一次出现的位置,返回指向第一次出现needle位置的指针,如果没找到则返回NULL。

至于k从什么地方开始和什么地方结束就比较让人头痛了。
for(k=j;k这个语句就是取子串用的,比如j=0,i=0的时候,k从0到len,那就是整个字符串了。
当i=1,j=0时,k从0到len-1。然后当i=1,j=1的时候,k从1到len。这两个就是长度为len-1的子串。
当i=2,j=0时,k从0到len-2。然后i=2,j=1时,k从1到len-1。然后i=2,j=2时,k从2到len。这三个就是长度为len-2的子串。
依此类推……

不知道我有没有说清楚。呵呵。


--------------------next---------------------
高手
那个gets是我搞错了 还有点问题要请教
这个题目终于他点头绪了 里面的原理由模糊开始变得清晰 越是清晰越发现你编程技术的高明
在这里我先问个题外问题——
一个题目在从审题到最后运行成功的这个过程中你是怎么做的?
比如说我就是
先看题目 然后就好象是凭一个思维的惯性去解决问题 如果我是遇到简单的题目还好 可以很快做出来 但稍微难点的 我就要很久才能理清思路 我觉得这样很不好 所以 我想看看你是怎么做的 来和大家分享你的经验吧
好 这个问题问到这里 我还有几个问题
就是这个题目不用strstr函数可以做出来吗 ?
还有就是我现在说说我的思路 看你可不可以帮我实现他
先求出最长的字符串(我称他为主字符串) 然后用他当中的每个字符和另外的字符串中每个字符进行比较 遇到相同的就暂停 从这个字符开始比较他们后边的字符 如果不同的话就又回到主字符串(用指针)和和他比较的字符串的与他相同的的字符的下一个开始 以此类推?
这个思路可能有点模糊 不过我现在还是认为他是可以被实现的
最后还想问个私人问题
你学C++多久了?现在 是在上班还是上学?
可以拒绝回答我 呵呵


--------------------next---------------------
首先我的思路就是在逻辑上是否容易实现,手里拿到一个东西,先想一想哪样比较方便,因为电脑运行和人脑思维大不一样,举一个很简单的例子,比如求两个数的最小公倍数,我们通常用学数学的经验,采用那种方式,但是如果编程来实现,用小学学的那种方法就太麻烦了,最简单的方法就是去两个中较大的那一个,然后让这个数不停地加1,当这个数做为除数能被那两个数整除的时候就OK了。这样实现起来非常方便,因为利用了计算机不怕麻烦的特点。当然这只是一种思路,要慢慢培养。我还差得很远呢……

然后就是不用strstr的情况,我认为完全可以,你完全可以自己实现和strstr一摸一样的功能,其实我在些这个程序的时候并不知道有这个函数,但是我觉得应该有某个函数可以完成这个功能,就偷了一下懒,到网上搜了一下,然后就找到了,然后就用了。这个功能完全可以自己编程实现,你可以尝试一下。

关于你说的这个思路,我觉得找出相同的子串不是问题,关键是最长的子串你如何判断,因为我写的那个程序出现第一个时就是最长的。而你这个思路却不是,所以会产生一个问题,就是你可能要添加一些变量来存储这个中间的值,最后再判断哪个最长,比我那个要麻烦一些,但是应该可以实现,你可以自己试一试。

我学习C++的时间很短,大约3个月,但是我本科的时候学过C语言,并且我之前还自己学习过VB、JAVA和.asp编程,当然都是学了一些皮毛而已,因为我不是学计算机系的,是搞通信的,研究方向是自适应信号处理和模式识别,目前在读相关方面的研究生,同时我现在在外面实习,所以由于工作需要学习了一下C++,做的主要是控制台编程处理二次雷达信息。

--------------------next---------------------

阅读(1105) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~