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 的优化,有点意外…… 但比我方法用少了一个变量,哈哈哈

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

posted @ 2022-02-20 18:49  windysai  阅读(67)  评论(0编辑  收藏  举报