最长的字母序连续子字符串的长度

标签: 字符串

难度: Medium

字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "abcdefghijklmnopqrstuvwxyz" 的任意子字符串都是 字母序连续字符串

  • 例如,"abc" 是一个字母序连续字符串,而 "acb""za" 不是。

给你一个仅由小写英文字母组成的字符串 s ,返回其 最长 的 字母序连续子字符串 的长度。

示例 1:

输入:s = "abacaba"
输出:2
解释:共有 4 个不同的字母序连续子字符串 "a"、"b"、"c" 和 "ab" 。
"ab" 是最长的字母序连续子字符串。

示例 2:

输入:s = "abcde"
输出:5
解释:"abcde" 是最长的字母序连续子字符串。

提示:

  • 1 <= s.length <= 105
  • s 由小写英文字母组成

Submission

运行时间: 124 ms

内存: 17.0 MB

class Solution:
    def longestContinuousSubstring(self, s: str) -> int:
        t=ord(s[0])
        m=0
        tt=1
        for i in s[1:]:
            if ord(i)!=t+1:
                if tt>m:
                    m=tt
                tt=0
            t=ord(i)
            tt+=1
        if tt>m:m=tt
        return m

Explain

该题解采用一次遍历的方式寻找最长的字母序连续子字符串。首先,初始化两个变量来记录当前连续子字符串的长度(`tt`)和最大长度(`m`)。遍历字符串中的每一个字符,通过比较当前字符的ASCII码值与前一个字符的ASCII码值加一是否相等来判断字符是否连续。如果不连续,先比较并可能更新最大长度`m`,然后重置当前连续长度`tt`。最后,遍历结束后再次检查并更新最大长度,以防最长连续子字符串出现在字符串的末尾。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def longestContinuousSubstring(self, s: str) -> int:
        t = ord(s[0])  # t记录前一个字符的ASCII码
        m = 0  # m记录最大连续字母序列的长度
        tt = 1  # tt记录当前连续字母序列的长度
        for i in s[1:]:  # 遍历s从第二个字符开始的每个字符
            if ord(i) != t + 1:  # 如果当前字符不是前一个字符的下一个字母
                if tt > m:
                    m = tt  # 更新最大长度m
                tt = 0  # 重置当前长度tt
            t = ord(i)  # 更新前一个字符的ASCII码
            tt += 1  # 增加当前长度tt
        if tt > m:
            m = tt  # 遍历结束后再次检查是否需要更新最大长度
        return m  # 返回最大长度

Explore

在Python中,字符可以直接比较,但是使用ASCII码比较可以更直观地表示字符的顺序关系。通过计算ASCII值并比较它们,我们可以清晰地验证两个字符是否按字母顺序连续。例如,'a'的ASCII是97,'b'是98,直接使用ASCII值比较可以明确地看出它们是否连续。这种方法在逻辑上更清晰,代码也更易于理解和维护。

算法在遍历过程中只有在字符序列断开时才会更新最大长度`m`。如果最长的连续子字符串恰好出现在字符串的末尾,那么在循环结束时这个最长的连续子字符串还没有被检查和更新到`m`中。因此,需要在循环结束后再次检查`tt`(当前连续子字符串的长度),以确保包括末尾的连续子字符串长度在内的最大长度被正确计算和返回。

是的,该算法能够正确处理长度为1的字符串。根据算法初始化时设置的`tt = 1`,即使字符串只有一个字符,`tt`已经记录了这个单个字符的长度。由于没有更多的字符进行比较,循环不会执行。因此,最终返回的`m`在最后一次检查中会被`tt`更新,正确地返回1。

这实际上是算法中的一个错误。在遇到不连续的字符时,应该将`tt`重置为1,而不是0。因为每个字符至少可以单独构成一个长度为1的连续子字符串。将`tt`设置为0会导致算法在处理断点后的第一个字符时丢失这个字符的计数。因此,正确的做法应该是在断点后将`tt`重置为1,以确保连续计数的正确性和算法的逻辑一致性。