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 的优化,有点意外…… 但比我方法用少了一个变量,哈哈哈
还是建议大家思考过再看吧~~~