题目描述:
字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "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, 1ans = 1while right < len(s):if ord(s[right]) - ord(s[right - 1]) == 1:ans = max(ans, right - left + 1)else:left = rightright += 1return ans