Leetcode 3. Longest Substring Without Repeating Characters
Leetcode 3. Longest Substring Without Repeating Characters
本题是一个中等题,采用双指针限定滑动窗口范围。官方题解有点让人困惑,总的来说思路和官方题解是一样的,不过官方题解使用 unordered_set
。我使用的是 unordered_map
记录字符出现的位置。如果字符出现位置在 [left, right]
之间则代表在 [left, right]
之间有重复字符。
本题中 Swift 又体现出独特性,在 Swift 中 String
是无法通过数字索引访问字符的,如果想使用数字索引访问字符,需要先将 String
转为 Character Array
, let sChars = Array(s)
。如果你不怕麻烦还可以这样访问:s[s.index(s.startIndex, offsetBy: idx)]
,写起来还是比较麻烦。
C++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n = s.size();
if(n == 1) return 1;
unordered_map ht;
// 双指针
int left(0), right(1);
ht[s[0]] = 0;
int res = 0;
while(left <= right && right < n) {
if(ht.find(s[right]) != ht.end() && ht[s[right]] >= left) {
left = ht[s[right]] + 1;
}
ht[s[right]] = right;
right++;
res = max(res, right-left);
}
return res;
}
};
Ruby
# @param {String} s
# @return {Integer}
def length_of_longest_substring(s)
sLength = s.length
if sLength == 1
return 1
end
left = 0
right = 1
ht = {s[0] => 0}
res = 0
while left <= right && right < sLength do
if ht.has_key?(s[right]) && ht[s[right]] >= left
left = ht[s[right]] + 1
end
ht[s[right]] = right
right = right + 1
res = [res, right-left].max
end
res
end
Python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
if n == 1 or n == 0:
return n
left = 0
right = 1
ht = dict()
ht[s[0]] = 0
res = 0
while left <= right and right < n:
if s[right] in ht and ht[s[right]] >= left:
left = ht[s[right]] + 1
ht[s[right]] = right
right = right + 1
res = max(res, right-left)
return res
Swift
class Solution {
func lengthOfLongestSubstring(_ s: String) -> Int {
let n = s.count
let sChars = Array(s)
if n == 0 || n == 1 {
return n
}
var left = 0, right = 1, res = 0
var ht: [Character: Int] = [Character:Int]()
ht[sChars[0]] = 0
while left <= right && right < n {
if let idx = ht[sChars[right]], idx >= left {
left = idx + 1
}
ht[sChars[right]] = right
right = right + 1
res = max(res, right-left)
}
return res
}
}