?題目描述:
字母序連續字符串?是由字母表中連續字母組成的字符串。換句話說,字符串?"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