标题:数据结构的问题,代码不明白为什么,求解惑
只看楼主
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
结帖率:66.67%
已结贴  问题点数:20 回复次数:5 
数据结构的问题,代码不明白为什么,求解惑
程序代码:
SqString* MaxSubstr(SqString s)
{
    SqString *sp;
    int index=0,length=0,length1,i=0,j,k;
    while(i</s.length)
</s.length)

搜索更多相关主题的帖子: 数据结构 代码 int length while 
2017-05-08 13:40
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
得分:0 
回复 楼主 姚萌萌
程序代码:
SqString* MaxSubstr(SqString s)
{
    SqString *sp;
    int index=0,length=0,length1,i=0,j,k;
    while(i<s.length)
    {
        j=i+1;
        while(j<s.length)
        {
            if(s.data[i]==s.data[j])
            {
                length1=1;
                for(k=1;s.data[i+k]==s.data[j+k];k++)//如果相同就继续朝后面找,这里明白
                    length1++;
                if(length<length1)//这里也明白
                {
                    length=length1;
                    index=i;
                }
                j+=length1;  //为什么?为什么不是直接break跳出来,然后从i+1继续找? 为什么要从这个重复出继续朝后面呢?
                       //我感觉这里并没有太大意义,和直接跳出去没有太大区别,是我理解错了吗???????
            }
            else
                j++;//这里也是这样,为什么呢?都已经不和i连在一起了,还怎么看重复呢?
        }
        i++;
    }
    sp=(SqString*)malloc(sizeof(LiString));
    sp->length=length;
    for(i=0;i<length;i++)
        sp->data[i]=s.data[i+index];
    return sp;
}

2017-05-08 13:41
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
还好会一点英文~看意思应该是寻找最长的重复子串吧~
如果是这样~知道当前获取子串的最大长度直接再寻找时遇到不相同的数字就可以直接跳过length1个字符~

举个例子

abcde
abcdeabcdkk和abcdfabcdkk前四个字符相等第五个字符不同这bcdea和bcdfa这样必然不同~你说从abcdk开始匹配效率高还是从bcdea开始匹配效率高呢~

[此贴子已经被作者于2017-5-8 17:12编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-08 17:05
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:20 
回复 3楼 九转星河
补充一下~

                j++;//这里也是这样,为什么呢?都已经不和i连在一起了,还怎么看重复呢?

这里可以理解为length1==0  ~~j++就不难理解了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-08 17:11
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
得分:0 
回复 4楼 九转星河
但是实际上你看,那里还有一个i,每次找到一个后都会加一,也就是说,由于i的存在,不管j跳过了多少,还是要把s里面的元素全过一遍。
而且,在j的那个循环里面,i是不变的,那么,当s.data[i]!=s.data[j]的时候,把j加一以后又和s.data[i]比较,就算相等了,也不是连续的串啊,我就是这一点想不明白,你说的那个我可以理解,但是不相等之后j+1了为什么还要和i比,那不都已经不是连续的了吗????
程序代码:
        while(j<s.length)
        {
            if(s.data[i]==s.data[j])
            {
                length1=1;
                for(k=1;s.data[i+k]==s.data[j+k];k++)
                    length1++;
                if(length<length1)
                {
                    length=length1;
                    index=i;
                }
                j+=length1; 
            }
            else
                j++;//为什么还要循环?不是已经不连续了吗?i并没有改变的。
        }
        i++;
    }
    sp=(SqString*)malloc(sizeof(LiString));
    sp->length=length;
    for(i=0;i<length;i++)
        sp->data[i]=s.data[i+index];
    return sp;
}

2017-05-08 17:21
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 5楼 姚萌萌
这个我也说不上来了~~可以自己试试改改~如果改正确了证明你的思路是可行的~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-08 17:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-476798-1-1.html




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

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