最长的字母序连续子字符串的长度
难度:
标签:
题目描述
代码结果
运行时间: 124 ms, 内存: 17.0 MB
/*
题目思路:
- 在 Java 中使用流的方式处理问题,首先将字符串转换为字符流,然后通过滑动窗口的方式检查每两个字符是否连续。
- 最后通过收集器计算出最长的连续子字符串长度。
*/
import java.util.stream.IntStream;
public class Solution {
public int longestContinuousSubstring(String s) {
return IntStream.range(1, s.length())
.map(i -> (s.charAt(i) - s.charAt(i - 1) == 1) ? 1 : -i)
.map(new int[] { 0, 0 }, (a, b) -> {
a[1] = b < 0 ? 1 : a[1] + 1;
a[0] = Math.max(a[0], a[1]);
return a;
})[0];
}
}
解释
方法:
该题解采用一次遍历的方式寻找最长的字母序连续子字符串。首先,初始化两个变量来记录当前连续子字符串的长度(`tt`)和最大长度(`m`)。遍历字符串中的每一个字符,通过比较当前字符的ASCII码值与前一个字符的ASCII码值加一是否相等来判断字符是否连续。如果不连续,先比较并可能更新最大长度`m`,然后重置当前连续长度`tt`。最后,遍历结束后再次检查并更新最大长度,以防最长连续子字符串出现在字符串的末尾。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么这个算法在判断字符是否连续时,使用ASCII码的比较而不是直接比较字符?
▷🦆
在最后一次循环后,为什么需要再次检查并可能更新最大长度`m`?
▷🦆
如果输入字符串`s`的长度为1,这个算法是否能正确处理并返回长度为1的结果?
▷🦆
在算法中,变量`tt`在遇到不连续的字符时为什么要设置为0,而不是1?这与算法的逻辑是否一致?
▷