[LeetCode] 2414. Length of the Longest Alphabetical Continuous Substring

CNoodle發表於2024-09-20

An alphabetical continuous string is a string consisting of consecutive letters in the alphabet. In other words, it is any substring of the string "abcdefghijklmnopqrstuvwxyz".

For example, "abc" is an alphabetical continuous string, while "acb" and "za" are not.
Given a string s consisting of lowercase letters only, return the length of the longest alphabetical continuous substring.

Example 1:
Input: s = "abacaba"
Output: 2
Explanation: There are 4 distinct continuous substrings: "a", "b", "c" and "ab".
"ab" is the longest continuous substring.

Example 2:
Input: s = "abcde"
Output: 5
Explanation: "abcde" is the longest continuous substring.

Constraints:
1 <= s.length <= 105
s consists of only English lowercase letters.

最長的字母序連續子字串的長度。

字母序連續字串 是由字母表中連續字母組成的字串。換句話說,字串 "abcdefghijklmnopqrstuvwxyz" 的任意子字串都是 字母序連續字串 。

例如,"abc" 是一個字母序連續字串,而 "acb" 和 "za" 不是。
給你一個僅由小寫英文字母組成的字串 s ,返回其 最長 的 字母序連續子字串 的長度。

思路

判斷兩個字母是否是字母表中連續的字母,就是去判斷他們 ASCII 碼的差值是否為 1。而且這道題降低了難度,"za" 這樣的字母序是不算作連續的字串的。

思路是雙指標,我們需要兩個指標,左指標指向當前字母,右指標從下一個字母開始一直往右走,判斷兩個指標指向的字母的 ASCII 碼的差值是否等於兩個指標下標的差。如果是,則說明這兩個字母是連續的,我們需要更新最長的字母序連續子字串的長度。

複雜度

時間O(n),n 是字串 s 的長度。
空間O(1),只需要常數的空間。

程式碼

Java實現

class Solution {
    public int longestContinuousSubstring(String s) {
        // corner case
        if (s == null || s.length() == 0) {
            return 0;
        }

        // normal case
        int res = 0;
        int i = 0;
        while (i < s.length()) {
            int start = i;
            while (i < s.length() && i - start == s.charAt(i) - s.charAt(start)) {
                i++;
            }
            res = Math.max(res, i - start);
        }
        return res;
    }
}

還有一種更簡便的做法是用 for 迴圈,判斷當前字母的 ASCII 碼是否比上一個字母的 ASCII 碼大 1,如果是,則說明這兩個字母是連續的,我們需要更新最長的字母序連續子字串的長度;如果不是則說明這兩個字母不是連續的,我們需要重新開始。

Java實現

class Solution {
    public int longestContinuousSubstring(String s) {
        int res = 1;
		int count = 1;
		for (int i = 1; i < s.length(); i++) {
			if (s.charAt(i) - s.charAt(i - 1) == 1) {
				count++;
				res = Math.max(res, count);
			} else {
				count = 1;
			}
		}
		return res;
    }
}

相關文章