481 字
2 分钟
1446. 连续字符
1446. 连续字符
题目描述
给你一个字符串 s,字符串的「能量」定义为:只含一种字符的最长非空子字符串的长度。
请你返回字符串 s 的能量。
示例 1:
输入:s = "leetcode"输出:2解释:子字符串 "ee" 长度为 2,只含字符 'e'。示例 2:
输入:s = "abbcccddddeeeeedcba"输出:5解释:子字符串 "eeeee" 长度为 5,只含字符 'e'。提示:
1 <= s.length <= 500s只包含小写英文字母
解题思路
核心思想
用分组循环把字符串划分成若干「连续相同字符」的段,取最长的段长度。灵茶山艾府题单里”分组循环”的经典骨架是「外层遍历段起点,内层扩展段终点」。
对每个段起点 i,用 j 向前扩展,直到 s[j+1] 与 s[i] 不同,此时 [i, j] 就是一个最长连续相同字符段,长度为 j - i + 1,用它更新答案,然后 i 跳到 j+1 开始下一段。
分组示意(s = “abbccc”):
a | b b | c c c段长 1 2 3 → 答案 3算法步骤
- 初始化
ans = 1(至少有一个字符),i = 0。 - 当
i < n时:j = i,内层while j+1 < n and s[j+1] == s[i]时j++;ans = max(ans, j - i + 1);i = j + 1。
- 返回
ans。
逐步举例
以 s = "abbcccddddeeeeedcba" 为例,最长为最后的 e 段:
| 段 | 区间 | 长度 |
|---|---|---|
| a | [0,0] | 1 |
| bb | [1,2] | 2 |
| ccc | [3,5] | 3 |
| dddd | [6,9] | 4 |
| eeeeee | [10,15] | 5 |
| d | [16,16] | 1 |
| c | [17,17] | 1 |
| b | [18,18] | 1 |
| a | [19,19] | 1 |
答案为 5。
复杂度分析
- 时间复杂度:O(N),每个下标只被访问常数次。
- 空间复杂度:O(1)。
代码实现
{{% highlight python %}}
class Solution: def maxPower(self, s: str) -> int: n = len(s) ans = 1 i = 0 while i < n: j = i while j + 1 < n and s[j + 1] == s[i]: j += 1 ans = max(ans, j - i + 1) i = j + 1 return ansimport sysfrom pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))import unittest
from solution import Solution
class TestSolution(unittest.TestCase): def test_example1(self): self.assertEqual(Solution().maxPower("leetcode"), 2)
def test_example2(self): self.assertEqual(Solution().maxPower("abbcccddddeeeeedcba"), 5)
if __name__ == '__main__': unittest.main(){{% /highlight %}}