Skip to content

Commit 35f5dde

Browse files
authored
Merge pull request soapyigu#367 from soapyigu/SlidingWindow
Refactor code style to Longest Substring with At Most K Distinct Char…
2 parents a440c74 + fef1217 commit 35f5dde

File tree

2 files changed

+46
-42
lines changed

2 files changed

+46
-42
lines changed

SlidingWindow/LongestSubstringMostKDistinctCharacters.swift

Lines changed: 21 additions & 17 deletions
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+
}
Lines changed: 25 additions & 25 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy