• LeetCode 1446 连续字符


    LeetCode 1446 连续字符解题思考

    一、题目描述

      给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。请你返回字符串的能量。

    示例 1: 

    输入:s = "leetcode"
    输出:2
    解释:子字符串 "ee" 长度为 2 ,只包含字符 'e'

    示例 2:

    输入:s = "abbcccddddeeeeedcba"
    输出:5
    解释:子字符串 "eeeee" 长度为 5 ,只包含字符 'e'

    示例3:

    输入:s = "triplepillooooow"
    输出:5

    示例4:

    输入:s = "hooraaaaaaaaaaay"
    输出:11

    示例5:

    输入:s = "tourist"
    输出:1

        提示:

    •   1 <= s.length <= 500
    •   s 只包含小写英文字母。

    二、题目分析

      实际上就是找出一个字符上,连续相同字母个数的最大值。归为字符串,或者模拟题的类比。

      我先画个流程图,再结合分析下:

    分析:

       (1)最外层初始值:ans保存最终结果值,i 是给出字符串A[x]的第一个位置( 1<= x <=len(A) )。

            (2)每一次遍历i:cnt 和 j 的初始值都为 1。

         cnt 记录的是每个 i 的最长步长。即,每遍历一个A[i],当 A[i+cnt] = A[i] 时(cnt >= 1),cnt 相对A[i] 可以走的最长步数;j 是每次遍历 i,相对 i 的下一个位置,如果A[i]=A[j],j 就前进一个位置,步长cnt相应加1,对应上图的 j = j+1,同时根据当前步长cnt,去更新ans的值

            该题有个优化,就是单独拎出来 cnt=1 的判断,如果cnt = 1,意味着 j=i+1,即两个紧挨着的两个字符不相等,此时 i 前进到下一个位置(对应上图:i=i+1); 如果cnt != 1,意味着 j 相对 i 不止走了一步,曾经走过上图A[i] = A[j] 的判断!也就是最长相同字母子串为:A[i]=A[i+cnt],但 A[i]  != A[i+cnt+1],即字符不相等,我们应该更新下一次遍历的 i 的位置,进行下一轮 i 的遍历。我们不再需要比较 i ~ i+cnt 的位置了,因为前面已经算过,这些位置的字符都是相等的,所以 i 的下一个位置应该跳到 i+cnt+1 。

            拿上面的字符串作为例子,当 i = 7,j 可以走到10的位置,cnt等于3,走到11的位置发现跟A[i] 不相等。此时应更新下一个遍历的 i 位置,应该是A[11],公式就是 i = i+cnt+1=7+3+1 = 11。我们没有必要将 i 前进一个步数,因为前一趟比较相等的时候,已经知道A[7]到A[10] 都是相等的

      最后贴个官方解题报告(微信打开):https://mp.weixin.qq.com/s/U8JpXqAnzPSFZy8rowkfuw 

           官方竟然没做 i 的优化,有点意外…… 但比我方法用少了一个变量,哈哈哈

      还是建议大家思考过再看吧~~~

  • 相关阅读:
    集合(set)
    字典方法
    字典(dict)
    元组(tuple)
    列表方法
    xxxx(四):接受消息hook地址分析
    xxxx(三)“黑吃黑”: 破解别人外挂
    UDP内网穿透和打洞原理与代码实现
    VMP加壳(三):VMP壳爆破实战-破解某编辑类软件
    VMP加壳(二):VMP的虚拟化原理
  • 原文地址:https://www.cnblogs.com/windysai/p/15916167.html
Copyright © 2020-2023  润新知