连续字符

标签: 字符串

难度: Easy

给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。

请你返回字符串 s能量

示例 1:

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

示例 2:

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

提示:

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

Submission

运行时间: 24 ms

内存: 16.4 MB

class Solution:
  def maxPower(self, s: str) -> int:
    #初始化最长子串长度和当前子串的长度
    max_length = 1
    current_length = 1

    # 遍历字符串(从第二个字符到最后一个字符)
    for i in range(1, len(s)):
        # 如果当前字符和前一个字符相同
        if s[i] == s[i - 1]:
            # 增加当前长度
            current_length += 1
            # 更新最长子串长度
            max_length = max(max_length, current_length)
        else:
            # 如果当前字符和前一个字符不同,则重新计数
            current_length = 1

    return max_length

Explain

题解的核心思路是通过一次遍历字符串来找到最长的连续相同字符的子串。首先设定两个变量,max_length 用于记录遍历过程中遇到的最大长度,current_length 用于记录当前连续字符的长度。遍历从第二个字符开始,如果当前字符与前一个字符相同,则增加 current_length 的长度;如果不同,则将 current_length 重置为 1。每次连续字符长度增加时,使用 max 函数更新 max_length。最终,max_length 将包含所需的最大连续字符长度。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
  def maxPower(self, s: str) -> int:
    # 初始化最长子串长度和当前子串的长度
    max_length = 1
    current_length = 1

    # 遍历字符串(从第二个字符到最后一个字符)
    for i in range(1, len(s)):
        # 如果当前字符和前一个字符相同
        if s[i] == s[i - 1]:
            # 增加当前长度
            current_length += 1
            # 更新最长子串长度
            max_length = max(max_length, current_length)
        else:
            # 如果当前字符和前一个字符不同,则重新计数
            current_length = 1

    return max_length

Explore

算法中从第二个字符开始遍历的做法并不会在字符串长度为1时遗漏检查。因为在开始遍历前,我们已经将 `max_length` 和 `current_length` 都初始化为1。所以,即使字符串只有一个字符,这个字符的长度已经被初始化为1,并且由于没有其他字符进行比较,`max_length` 保持为1,这是正确的结果。

是的,如果字符串中所有字符都相同,`current_length` 的更新逻辑仍然有效。在这种情况下,每次循环中当前字符与前一个字符相同,所以 `current_length` 将不断增加,并且每次比较后用 `max` 函数更新 `max_length`,最终 `max_length` 将等于整个字符串的长度,这正是我们想要的结果。

使用 `max` 函数在每次迭代中更新 `max_length` 可能看起来效率较低,因为它在每次循环中都进行了一次比较和可能的赋值操作。然而,这种效率影响是非常小的,因为 `max` 是一个O(1)操作,即常数时间复杂度。整体算法的时间复杂度仍然是O(n),其中n是字符串的长度。使用 `max` 函数带来的简洁和清晰的代码通常是值得的。

算法结束后直接返回 `max_length` 考虑了所有可能的边界情况,包括字符串完全由不同字符组成的情况。在这种情况下,每次比较发现不同字符时,`current_length` 会重置为1,而 `max_length` 也始终保持在初始值1,因为没有任何连续字符子串长度超过1。因此,返回的 `max_length` 为1,正确反映了这种边界情况下的最长连续字符长度。