• 串的顺序存储的应用实例二


    苏格拉底是古希腊著名的哲学家。有一天,他带领几个弟子来到一块麦地

    边。那时正是麦子成熟的季节,地里满是沉甸甸的麦穗。苏格拉底对弟子们说:

    “你们去麦地里摘一个最大的麦穗,只许进不许退。我在麦地的尽头等你们。”

    弟子们陆续走进了麦地。到处都是大麦穗,哪一个才是最大的呢?他们埋

    头向前走,看看这一株,摇了摇头;看看那一株,又摇了摇头。虽然有人也曾

    试着摘了几穗,但想到前面可能还有更大的,于是就毫不犹豫地把手里的麦穗

    扔掉了。

    就这样,他们一边低着头往前走,一边用心地挑挑拣拣,经过了很长一段

    时间。突然,他们听到苏格拉底苍老的、如同洪钟一般的声音:“你们已经到

    头了。”这时两手空空的弟子们才如梦初醒。

    苏格拉底对弟子们说:“这块麦地里肯定有一穗是最大的,但你们未必能

    碰见它;即使碰见了,也未必能作出准确的判断。因此最大的一穗应该就是你

    们刚刚摘下的。


    我们从这个故事里,得到弟子们并没有把手中的麦穗和 遇到的麦穗进行比较 ,所以才会造成没有摘到最大的麦穗 , 我们先摘下第一株麦子 ,然后和遇到的麦子进行比较 ,如果比手中的麦子大, 那我们就丢弃手中的麦子 ,然后去摘更大的麦子 ,直到结束 ,我们一定能摘到想要的麦子.

    现在我们就引入一个串比较的问题 :

    ● 问题

            • 求出串中 一个 最长的 连续相同的平台

     就是最长的连续的字符  ,就像我们找最大麦穗一样 ,逐个对比, 当遇到比当前存储的连续字符上的字符的话,我们就更新最长字符的位置 和 最长字符的长度

    ● 算法思路

            • 循环比较相邻字符

                    ① 若相邻字符相等 , 累加相同字符的长度

                    ② 否则:

                            更新最长连续相同字符信息

                            为继续找出做好准备

    ● 算法实操:

            思路其实很简单 ,我们先从第一个元素开始 , 遍历 ,初始长度是0 ,如果遇到相同的元素, 就把相同字符的长度加一 ,如果遇到 不同字符 ,就说明我们此时的相同字符串就断了 , 我们此时有断掉的字符串长度 ,然后和 保存的最长字符串比较 ,如果小于 ,就不更新  ,如果比保存的字符串大 ,就更新最长字符串 ,注意 我们更新的是 最长字符串的开始地址字符串长度 ,

    然后我们后续接着遍历 ,下一个字符串 ,寻找最长字符串 ,直到结束

    1. //传入要进行比较的字符串 ,存储最大字符串的开始地址,存储最大的长度的地址
    2. void LongestString(SqString s,int &index,int&max)
    3. {
    4. //初始的时候,我们遇到的第一个元素,就默认是最大字符串,所有length标记为1
    5. int length=1;
    6. //从开始出发 标记最大字符串开始地址的 start标记为0,从第一个元素开始 下标为0
    7. int i=0;
    8. int start=0;
    9. //刚开始默认最大的字符地址就是第一个数 ,位序为0, 最大的坐标还没有更新,就默认为0
    10. index = 0,max = 0;
    11. //开始遍历循环
    12. //遍历的长度小于数组长度的时候,就一直循环遍历
    13. while (i-1)
    14. {
    15. //如果第一个元素和第二个元素相等的话,就说明是相同字符,长度加一,然后后移
    16. if(s.data[i]==s.data[i+1])
    17. {
    18. //累加相同字符的长度
    19. //判断相同,则i后移到相同字符的位置,长度加一
    20. i++;
    21. length++;
    22. }
    23. //当不相等的时候,我们就把这一截截断了,;并且要判断其长度了
    24. else
    25. {
    26. //比较截断的字符串长度和存储的最长字符串信息的长度
    27. //更新最长连续相同字符信息
    28. //如果截断的字符串比最大的字符串长度大,则更新长度
    29. //更新字符串的开始地址
    30. if(max < length){
    31. //此时 i 指向的就是最长字符串的最后一个字符
    32. max=length;
    33. //最长字符的索引就是开头字符
    34. index=start;
    35. }
    36. //接下来就开始下一个车字符串的对比,每次计算的开始地址也更新为下一个字符串
    37. //长度也更新为1,从头开始
    38. //为继续找出做好准备
    39. // i指向截断字符的后面位置
    40. i++;
    41. //索引也更新
    42. stat=i;
    43. //长度默认为第一个元素为1
    44. length=1;
    45. }
    46. }

  • 相关阅读:
    计算机视觉全系列实战教程:(八)图像变换-点运算、灰度变换、直方图变换
    FPGA结构:LATCH(锁存器)和 FF(触发器)介绍
    录制第一个jmeter性能测试脚本2(http协议)
    vulnhub靶场之VIKINGS: 1
    雷顿学院大数据(一期课程)
    【图解算法数据结构】搜索与回溯算法篇 + Java代码实现
    OpenGL之纹理过滤(Texture Filtering)、MipMap方法、纹理坐标
    C/C++ 实现获取硬盘序列号
    ATFX汇市:为什么英央行维持利率不变,而不是加息25基点?
    【前端】[vue3] [uni-app] 组件样式击穿:deep
  • 原文地址:https://blog.csdn.net/qq_57484399/article/details/127450781