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;
}
}