Skip to content

Commit fef1217

Browse files
committed
Refactor code style to Longest Substring with At Most K Distinct Characters and Longest Substring with At Most Two Distinct Characters
1 parent 264d2ab commit fef1217

2 files changed

+46
-42
lines changed

SlidingWindow/LongestSubstringMostKDistinctCharacters.swift

+21-17
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,33 @@ class LongestSubstringMostKDistinctCharacters {
1313
guard k > 0 else {
1414
return 0
1515
}
16-
16+
17+
var charFreqMap = [Character: Int](), left = 0, res = 0
1718
let s = Array(s)
18-
var start = 0, longest = 0, charsFreq = [Character: Int]()
19-
19+
2020
for (i, char) in s.enumerated() {
21-
if let freq = charsFreq[char] {
22-
charsFreq[char] = freq + 1
21+
if let freq = charFreqMap[char] {
22+
charFreqMap[char] = freq + 1
2323
} else {
24-
while charsFreq.count == k {
25-
longest = max(i - start, longest)
26-
27-
guard let freq = charsFreq[s[start]] else {
24+
25+
// update res
26+
res = max(i - left, res)
27+
28+
// move left and window
29+
while charFreqMap.count == k {
30+
if let leftFreq = charFreqMap[s[left]] {
31+
charFreqMap[s[left]] = leftFreq == 1 ? nil : leftFreq - 1
32+
left += 1
33+
} else {
2834
fatalError()
2935
}
30-
charsFreq[s[start]] = freq == 1 ? nil : freq - 1
31-
32-
start += 1
3336
}
34-
35-
charsFreq[char] = 1
37+
38+
// update window for current char
39+
charFreqMap[char] = 1
3640
}
3741
}
38-
39-
return max(longest, s.count - start)
42+
43+
return max(res, s.count - left)
4044
}
41-
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* Question Link: https://leetcode.com/problems/longest-substring-with-at-most-two-distinct-characters/
3-
* Primary idea: Slding window, use dictionary to check substring is valid or not, and
3+
* Primary idea: Slding window. Use char freq map to check substring is valid or not, and
44
note to handle the end of string edge case
55
*
66
* Time Complexity: O(n), Space Complexity: O(n)
@@ -9,32 +9,32 @@
99

1010
class LongestSubstringMostTwoDistinctCharacters {
1111
func lengthOfLongestSubstringTwoDistinct(_ s: String) -> Int {
12-
var start = 0, longest = 0, charFreq = [Character: Int]()
13-
let sChars = Array(s)
14-
15-
for (i, char) in sChars.enumerated() {
16-
if let freq = charFreq[char] {
17-
charFreq[char] = freq + 1
12+
var charFreqMap = [Character: Int](), left = 0, res = 0
13+
let s = Array(s)
14+
15+
for (i, char) in s.enumerated() {
16+
if let freq = charFreqMap[char] {
17+
charFreqMap[char] = freq + 1
1818
} else {
19-
if charFreq.count == 2 {
20-
longest = max(longest, i - start)
21-
22-
while charFreq.count == 2 {
23-
let charStart = sChars[start]
24-
charFreq[charStart]! -= 1
25-
26-
if charFreq[charStart] == 0 {
27-
charFreq[charStart] = nil
28-
}
29-
30-
start += 1
31-
}
19+
20+
// update res
21+
res = max(i - left, res)
22+
23+
// move left and window
24+
while charFreqMap.count == 2 {
25+
if let leftFreq = charFreqMap[s[left]] {
26+
charFreqMap[s[left]] = leftFreq == 1 ? nil : leftFreq - 1
27+
left += 1
28+
} else {
29+
fatalError()
30+
}
3231
}
33-
34-
charFreq[char] = 1
32+
33+
// update window for current char
34+
charFreqMap[char] = 1
3535
}
3636
}
37-
38-
return max(longest, sChars.count - start)
37+
38+
return max(res, s.count - left)
3939
}
40-
}
40+
}

0 commit comments

Comments
 (0)