Easy

题目描述

字符串的 能量 定义为只包含一种字符的非空子字符串的最大长度。

给你一个字符串 s,返回 s 的能量。

示例 1:

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

示例 2:

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

提示:

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

解题思路

解题思路

这是一道经典的连续相同字符统计问题,可以用多种方法解决:

方法一:双指针法 使用快慢指针遍历字符串,当快指针指向的字符与慢指针不同时,计算当前连续字符的长度,更新最大值,然后移动慢指针。

方法二:单指针计数法(推荐) 维护一个计数器,遍历字符串时:

  • 如果当前字符与前一个字符相同,计数器加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)只使用了常数级别的额外空间

相关题目