题目描述:
字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "abcdefghijklmnopqrstuvwxyz"
的任意子字符串都是 字母序连续字符串 。
- 例如,
"abc"
是一个字母序连续字符串,而"acb"
和"za"
不是。
给你一个仅由小写英文字母组成的字符串 s
,返回其 最长 的 字母序连续子字符串 的长度。
代码思路:
- 初始化变量:
left
和right
:这两个变量分别表示当前考察的连续子字符串的左右边界。初始时,left
设为 0,right
设为 1,表示从字符串的第二个字符开始向右扩展考察。ans
:用来记录目前找到的最长的字母序连续子字符串的长度。初始时,由于每个字符自身都可以看作是一个长度为 1 的连续子字符串,所以ans
设为 1。
- 遍历字符串:
- 使用一个
while
循环遍历字符串,直到right
达到字符串的长度。 - 在循环内部,首先检查当前字符
s[right]
和前一个字符s[right - 1]
是否是连续的(即ord(s[right]) - ord(s[right - 1]) == 1
)。这里ord()
函数用于获取字符的 ASCII 值。
- 使用一个
- 更新最长长度:
- 如果当前字符和前一个字符是连续的,则更新
ans
为当前考察的子字符串长度(right - left + 1
)和之前记录的最长长度ans
中的较大值。 - 如果当前字符和前一个字符不连续,则将
left
更新为right
,表示重新开始考察一个新的连续子字符串。
- 如果当前字符和前一个字符是连续的,则更新
- 移动右边界:
- 无论是否连续,每次循环都将
right
加 1,以继续向右扩展考察。
- 无论是否连续,每次循环都将
- 返回结果:
- 当
right
遍历完整个字符串后,返回ans
,即最长的字母序连续子字符串的长度。
- 当
代码实现:
class Solution:
def longestContinuousSubstring(self, s: str) -> int:
left, right = 0, 1
ans = 1
while right < len(s):
if ord(s[right]) - ord(s[right - 1]) == 1:
ans = max(ans, right - left + 1)
else:
left = right
right += 1
return ans