LeetCode 159. Longest Substring with At Most Two Distinct Characters --Java,C++,Python解法


LeetCode題解專欄:LeetCode題解
我做的所有的LeetCode的題目都放在這個專欄裏,大部分題目Java和Python的解法都有。


題目地址:Longest Substring with At Most Two Distinct Characters - LeetCode


Given a string s , find the length of the longest substring t that contains at most 2 distinct characters.

Example 1:

Input: "eceba"
Output: 3
Explanation: t is "ece" which its length is 3.

Example 2:

Input: "ccaabbb"
Output: 5
Explanation: t is "aabbb" which its length is 5.

這道題目是hard難度的,題目的意思很簡單,就是找到具有最多兩個不同字符的最長子串的長度。

看到題目會感覺O(n)的時間複雜度應該能做出這道題目。

在寫了大約20分鐘代碼後,Python解法出來了:

class Solution:
    def lengthOfLongestSubstringTwoDistinct(self, s: str) -> int:
        count = 0
        p = {}
        l = {}
        for now in range(0, len(s)):
            i = s[now]
            p[i] = now
            if len(l) < 2 and i not in l:
                l[i] = 1
            elif i in l:
                l[i] += 1
            else:
                if count < sum(l.values()):
                    count = sum(l.values())
                for j in l.keys():
                    if j != s[now-1]:
                        l.pop(j)
                        l[list(l.keys())[0]] = now-p[j]-1
                        break
                l[i] = 1
        if l != {}:
            if count < sum(l.values()):
                count = sum(l.values())
        return count

我的解法稍微有點麻煩,但易懂,最快解法如下:

class Solution:
    def lengthOfLongestSubstringTwoDistinct(self, s: str) -> int:
        i, l, k = -1, 0, 0
        for j in range(1, len(s)):
            if s[j] != s[j-1]:
                if i > -1 and s[i] != s[j]:
                    l, k = i+1, max(k, j-l)
                i = j-1
        return max(k, len(s)-l)

核心思路跟我的做法一樣。

區別在於它使用i和j來跟蹤兩個字符的最後一個索引。i跟蹤第一個字符,j跟蹤第二個字符。但我仍然喜歡hashmap解決方案,因爲我們可以輕鬆地將該解決方案擴展到K個不同的字符。

C++解法如下:

class Solution
{
public:
    int lengthOfLongestSubstringTwoDistinct(string s)
    {
        int i = 0, j = -1;
        int maxLen = 0;
        for (int k = 1; k < s.size(); k++)
        {
            if (s[k] == s[k - 1])
                continue;
            if (j > -1 && s[k] != s[j])
            {
                maxLen = max(maxLen, k - i);
                i = j + 1;
            }
            j = k - 1;
        }
        return maxLen > (s.size() - i) ? maxLen : s.size() - i;
    }
};

其他人的Java解法如下:

class Solution {
    public int lengthOfLongestSubstringTwoDistinct(String str) {
        int i = 0, j = -1;
        int maxLen = 0;
        char[] s = str.toCharArray();
        for (int k = 1; k < s.length; k++) {
            if (s[k] == s[k - 1])
                continue;
            if (j > -1 && s[k] != s[j]) {
                maxLen = Math.max(maxLen, k - i);
                i = j + 1;
            }
            j = k - 1;
        }
        return maxLen > (s.length - i) ? maxLen : s.length - i;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章