leetcode
leetcode 1301 ~ 1350
连续字符

连续字符

难度:

标签:

题目描述

代码结果

运行时间: 24 ms, 内存: 16.4 MB


/*
 * 思路:
 * 使用 Java Stream 进行字符串处理。利用 IntStream 生成字符序列,
 * 遍历字符串,计算当前字符能量值,并与最大能量值比较更新。
 */
import java.util.stream.IntStream;

public class Solution {
    public int maxPower(String s) {
        return IntStream.range(1, s.length())
                .map(i -> s.charAt(i) == s.charAt(i - 1) ? 1 : -i)
                .map(Math::abs)
                .reduce((acc, i) -> acc + i)
                .orElse(1);
    }
}

解释

方法:

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

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
算法中提到的'遍历字符串从第二个字符开始',这种做法是否会在字符串长度为1时遗漏检查?
算法中从第二个字符开始遍历的做法并不会在字符串长度为1时遗漏检查。因为在开始遍历前,我们已经将 `max_length` 和 `current_length` 都初始化为1。所以,即使字符串只有一个字符,这个字符的长度已经被初始化为1,并且由于没有其他字符进行比较,`max_length` 保持为1,这是正确的结果。
🦆
在算法中,如果字符串中所有字符都相同,current_length的更新逻辑是否仍然有效?
是的,如果字符串中所有字符都相同,`current_length` 的更新逻辑仍然有效。在这种情况下,每次循环中当前字符与前一个字符相同,所以 `current_length` 将不断增加,并且每次比较后用 `max` 函数更新 `max_length`,最终 `max_length` 将等于整个字符串的长度,这正是我们想要的结果。
🦆
题解中提到使用max函数更新max_length,这种每次迭代更新的方式是否有可能导致算法效率降低?
使用 `max` 函数在每次迭代中更新 `max_length` 可能看起来效率较低,因为它在每次循环中都进行了一次比较和可能的赋值操作。然而,这种效率影响是非常小的,因为 `max` 是一个O(1)操作,即常数时间复杂度。整体算法的时间复杂度仍然是O(n),其中n是字符串的长度。使用 `max` 函数带来的简洁和清晰的代码通常是值得的。
🦆
算法结束后直接返回max_length,是否考虑了所有可能的边界情况,例如字符串完全由不同字符组成的情况?
算法结束后直接返回 `max_length` 考虑了所有可能的边界情况,包括字符串完全由不同字符组成的情况。在这种情况下,每次比较发现不同字符时,`current_length` 会重置为1,而 `max_length` 也始终保持在初始值1,因为没有任何连续字符子串长度超过1。因此,返回的 `max_length` 为1,正确反映了这种边界情况下的最长连续字符长度。

相关问题