/*
你太过讲了,其实我的水平很一般的,距离高手还差得太远了。
学习过指针、数组和循环已经可以完成这个题目了,不需要其它的知识。只不过这里可能有一些让人头痛的算法,所以实现起来有点困难。
我再把我的思路修改一下,就是先找到最短的字符串,然后由长到短取它的子串,去其它字符串中去找这个子串,如果都找到了那么它就是最长的公共子串了。
我编写了一个,你可以看看。你也可以把你的思路跟我说说,我们交流一下,看看实现方便不方便。
*/
#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) |