-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy path3_LongestSubstringWithoutRepeatingCharacters.swift
111 lines (95 loc) · 3.12 KB
/
3_LongestSubstringWithoutRepeatingCharacters.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//
// 3. 无重复字符的最长子串
//
// 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
//
// 题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
// 标签:哈希表、双指针、字符串、滑动窗口
// 要点:前后双指针,滑动窗口,计算最大值
// 时间复杂度:O(N)
// 空间复杂度:O(k), k = min(m, n)
//
/// 前后双指针
class Solution {
func lengthOfLongestSubstring(_ s: String) -> Int {
guard !s.isEmpty else { return 0 }
let chars = [Character](s)
var maxLenth = 0
var set = Set<Character>()
var startIndex = 0
for i in 0 ..< s.count {
let current = chars[i]
if set.contains(current) {
maxLenth = max(maxLenth, i - startIndex)
while chars[startIndex] != current {
set.remove(chars[startIndex])
startIndex += 1
}
startIndex += 1
} else {
set.insert(current)
}
}
return max(maxLenth, chars.count - startIndex)
}
}
/// 滑动窗口
class Solution2 {
func lengthOfLongestSubstring(_ s: String) -> Int {
guard !s.isEmpty else { return 0 }
let chars = [Character](s)
var (left, right, maxLength) = (0, 0, 0)
var set = Set<Character>()
while right < chars.count {
if set.contains(chars[right]) {
set.remove(chars[left])
left += 1
} else {
set.insert(chars[right])
right += 1
maxLength = max(maxLength, right - left)
}
}
return maxLength
}
}
/// 计算最大值
class Solution3 {
func lengthOfLongestSubstring(_ s: String) -> Int {
guard !s.isEmpty else { return 0 }
let chars = [Character](s)
var (left, right, maxLength) = (0, 0, 0)
var dictionary = [Character: Int]()
while right < chars.count {
if let index = dictionary[chars[right]] {
left = max(left, index + 1)
}
dictionary[chars[right]] = right
right += 1
maxLength = max(maxLength, right - left)
}
return maxLength
}
}
// Tests
let s = Solution()
s.lengthOfLongestSubstring("abcabcbb") == 3
s.lengthOfLongestSubstring("bbbbb") == 1
s.lengthOfLongestSubstring("pwwkew") == 3
s.lengthOfLongestSubstring("a") == 1
s.lengthOfLongestSubstring(" ") == 1
s.lengthOfLongestSubstring("tmmzuxt") == 5
let s2 = Solution2()
s2.lengthOfLongestSubstring("abcabcbb") == 3
s2.lengthOfLongestSubstring("bbbbb") == 1
s2.lengthOfLongestSubstring("pwwkew") == 3
s2.lengthOfLongestSubstring("a") == 1
s2.lengthOfLongestSubstring(" ") == 1
s2.lengthOfLongestSubstring("tmmzuxt") == 5
let s3 = Solution3()
s3.lengthOfLongestSubstring("abcabcbb") == 3
s3.lengthOfLongestSubstring("bbbbb") == 1
s3.lengthOfLongestSubstring("pwwkew") == 3
s3.lengthOfLongestSubstring("a") == 1
s3.lengthOfLongestSubstring(" ") == 1
s3.lengthOfLongestSubstring("tmmzuxt") == 5