【每日一题】LeetCode 2414.最长字母序连续子字符串的长度(字符串)
题目描述
字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "abcdefghijklmnopqrstuvwxyz"
的任意子字符串都是 字母序连续字符串 。
- 例如,
"abc"
是一个字母序连续字符串,而"acb"
和"za"
不是。
给你一个仅由小写英文字母组成的字符串 s
,返回其 最长 的 字母序连续子字符串 的长度。
思路分析
要解决这个问题,我们可以遍历字符串 s
,并对于每对相邻的字符,检查它们是否是连续的。如果连续,我们就可以增加当前连续子字符串的长度计数器;如果不连续,我们则重置计数器。同时,我们需要维护一个记录最大长度的变量。
具体步骤如下:
- 初始化最大长度
max
为 1,因为即使字符串只有一个字符,它也是一个连续的子字符串。 - 初始化当前长度
cur
为 1。 - 遍历字符串
s
,从第二个字符开始,比较当前字符和前一个字符的 ASCII 值。 - 如果当前字符的 ASCII 值比前一个字符的 ASCII 值大 1,说明它们是连续的,增加
cur
。 - 如果不是连续的,重置
cur
为 1。 - 在每一步,使用
Math.max
函数更新max
为cur
和max
之间的较大值。 - 最后返回
max
作为结果。
输入示例
-
s = "abacaba"
- 输出:2
- 解释:最长的字母序连续子字符串是 “ab”。
-
s = "abcde"
- 输出:5
- 解释:整个字符串 “abcde” 本身就是一个最长的字母序连续子字符串。
代码实现
class Solution {
public int longestContinuousSubstring(String s) {
// 如果字符串为空,返回0
if (s.length() == 0) {
return 0;
}
// 初始化最大长度为1,因为至少每个字符都是一个长度为1的连续子字符串
int max = 1;
// 初始化当前长度为1
int cur = 1;
// 遍历字符串,从第二个字符开始
for (int i = 1; i < s.length(); i++) {
// 如果当前字符和前一个字符是连续的(ASCII码相差1)
if (s.charAt(i) == s.charAt(i - 1) + 1) {
// 增加当前长度计数器
cur++;
} else {
// 如果不是连续的,重置当前长度计数器为1
cur = 1;
}
// 更新最大长度
max = Math.max(max, cur);
}
// 返回最大长度
return max;
}
}