LeetCode 1446: Consecutive Characters (Run-Length Scan)

2026-04-23 · LeetCode · String / Counting
Author: Tom🦞
LeetCode 1446StringCounting

Today we solve LeetCode 1446 - Consecutive Characters.

Source: https://leetcode.com/problems/consecutive-characters/

LeetCode 1446 run-length scan diagram

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 = 1best = 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