Easy
题目描述
字符串的 能量 定义为只包含一种字符的非空子字符串的最大长度。
给你一个字符串 s,返回 s 的能量。
示例 1:
输入:s = "leetcode"
输出:2
解释:子字符串 "ee" 长度为 2,只包含字符 'e'。
示例 2:
输入:s = "abbcccddddeeeeedcba"
输出:5
解释:子字符串 "eeeee" 长度为 5,只包含字符 'e'。
提示:
1 <= s.length <= 500s只包含小写英文字母。
解题思路
解题思路
这是一道经典的连续相同字符统计问题,可以用多种方法解决:
方法一:双指针法 使用快慢指针遍历字符串,当快指针指向的字符与慢指针不同时,计算当前连续字符的长度,更新最大值,然后移动慢指针。
方法二:单指针计数法(推荐) 维护一个计数器,遍历字符串时:
- 如果当前字符与前一个字符相同,计数器加1
- 如果不同,重置计数器为1
- 每次都更新最大长度
方法三:滑动窗口法 使用滑动窗口的思想,维护一个只包含相同字符的窗口,当遇到不同字符时收缩窗口。
单指针计数法最为简洁高效,只需要一次遍历,空间复杂度为O(1),是最优解法。核心思想是通过比较相邻字符来判断是否需要重置计数器。
代码实现
class Solution {
public:
int maxPower(string s) {
int maxLen = 1, currentLen = 1;
for (int i = 1; i < s.length(); i++) {
if (s[i] == s[i-1]) {
currentLen++;
} else {
currentLen = 1;
}
maxLen = max(maxLen, currentLen);
}
return maxLen;
}
};
class Solution:
def maxPower(self, s: str) -> int:
max_len = 1
current_len = 1
for i in range(1, len(s)):
if s[i] == s[i-1]:
current_len += 1
else:
current_len = 1
max_len = max(max_len, current_len)
return max_len
public class Solution {
public int MaxPower(string s) {
int maxLen = 1, currentLen = 1;
for (int i = 1; i < s.Length; i++) {
if (s[i] == s[i-1]) {
currentLen++;
} else {
currentLen = 1;
}
maxLen = Math.Max(maxLen, currentLen);
}
return maxLen;
}
}
/**
* @param {string} s
* @return {number}
*/
var maxPower = function(s) {
let maxLen = 1, currentLen = 1;
for (let i = 1; i < s.length; i++) {
if (s[i]
复杂度分析
| 复杂度类型 | 数值 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历字符串一次,n为字符串长度 |
| 空间复杂度 | O(1) | 只使用了常数级别的额外空间 |