LeetCode 1446: Consecutive Characters (Run-Length Scan)
LeetCode 1446StringCountingToday we solve LeetCode 1446 - Consecutive Characters.
Source: https://leetcode.com/problems/consecutive-characters/
English
Problem Summary
Given a string s, return the length of the longest non-empty substring that contains only one unique character.
Key Insight
This is a classic run-length scan. Count the current streak of identical characters and keep a global maximum. Reset streak when character changes.
Algorithm
- Initialize cur = 1 and best = 1.
- For each index i > 0, compare s[i] with s[i-1].
- If equal: cur++; otherwise reset cur = 1.
- Update best = max(best, cur).
Complexity Analysis
Time: O(n).
Space: O(1).
Common Pitfalls
- Forgetting to update best after streak extension.
- Not handling length-1 strings correctly.
- Accidentally resetting streak to 0 instead of 1.
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution {
public int maxPower(String s) {
int best = 1, cur = 1;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == s.charAt(i - 1)) {
cur++;
} else {
cur = 1;
}
best = Math.max(best, cur);
}
return best;
}
}func maxPower(s string) int {
best, cur := 1, 1
for i := 1; i < len(s); i++ {
if s[i] == s[i-1] {
cur++
} else {
cur = 1
}
if cur > best {
best = cur
}
}
return best
}class Solution {
public:
int maxPower(string s) {
int best = 1, cur = 1;
for (int i = 1; i < (int)s.size(); i++) {
if (s[i] == s[i - 1]) cur++;
else cur = 1;
best = max(best, cur);
}
return best;
}
};class Solution:
def maxPower(self, s: str) -> int:
best = cur = 1
for i in range(1, len(s)):
if s[i] == s[i - 1]:
cur += 1
else:
cur = 1
best = max(best, cur)
return best/**
* @param {string} s
* @return {number}
*/
var maxPower = function(s) {
let best = 1, cur = 1;
for (let i = 1; i < s.length; i++) {
if (s[i] === s[i - 1]) cur++;
else cur = 1;
best = Math.max(best, cur);
}
return best;
};中文
题目概述
给定字符串 s,返回只包含同一字符的最长非空子串长度。
核心思路
这是连续段统计问题。维护当前连续段长度 cur,每次与前一个字符比较。相同就延长,不同就重置,并持续更新全局最大值 best。
算法步骤
- 初始化 cur = 1、best = 1。
- 从下标 1 开始遍历:若 s[i] == s[i-1],则 cur++;否则 cur = 1。
- 每一步更新 best = max(best, cur)。
复杂度分析
时间复杂度:O(n)。
空间复杂度:O(1)。
常见陷阱
- 连续段增加后忘记更新最大值。
- 单字符字符串边界处理错误。
- 字符变化时把连续段重置为 0 而不是 1。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
class Solution {
public int maxPower(String s) {
int best = 1, cur = 1;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == s.charAt(i - 1)) {
cur++;
} else {
cur = 1;
}
best = Math.max(best, cur);
}
return best;
}
}func maxPower(s string) int {
best, cur := 1, 1
for i := 1; i < len(s); i++ {
if s[i] == s[i-1] {
cur++
} else {
cur = 1
}
if cur > best {
best = cur
}
}
return best
}class Solution {
public:
int maxPower(string s) {
int best = 1, cur = 1;
for (int i = 1; i < (int)s.size(); i++) {
if (s[i] == s[i - 1]) cur++;
else cur = 1;
best = max(best, cur);
}
return best;
}
};class Solution:
def maxPower(self, s: str) -> int:
best = cur = 1
for i in range(1, len(s)):
if s[i] == s[i - 1]:
cur += 1
else:
cur = 1
best = max(best, cur)
return best/**
* @param {string} s
* @return {number}
*/
var maxPower = function(s) {
let best = 1, cur = 1;
for (let i = 1; i < s.length; i++) {
if (s[i] === s[i - 1]) cur++;
else cur = 1;
best = Math.max(best, cur);
}
return best;
};
Comments