无重复字符的最长子串
作者:互联网
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
max_len = 0
dic = {}
ls = []
for c in s:
if c in dic:
dic = {}
dic[c] = 1
for i in range(ls.index(c)+1, len(ls)):
dic[ls[i]] = 1
ls = ls[ls.index(c)+1:]
ls.append(c)
if max_len < len(dic):
max_len = len(dic)
else:
ls.append(c)
dic[c] = 1
if max_len < len(dic):
max_len = len(dic)
return max_len
这题应该使用滑动窗口
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 哈希集合,记录每个字符是否出现过
occ = set()
n = len(s)
# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rk, ans = -1, 0
for i in range(n):
if i != 0:
# 左指针向右移动一格,移除一个字符
occ.remove(s[i - 1])
while rk + 1 < n and s[rk + 1] not in occ:
# 不断地移动右指针
occ.add(s[rk + 1])
rk += 1
# 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1)
return ans
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// 哈希集合,记录每个字符是否出现过
unordered_set<char> occ;
int n = s.size();
// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
int rk = -1, ans = 0;
// 枚举左指针的位置,初始值隐性地表示为 -1
for (int i = 0; i < n; ++i) {
if (i != 0) {
// 左指针向右移动一格,移除一个字符
occ.erase(s[i - 1]);
}
while (rk + 1 < n && !occ.count(s[rk + 1])) {
// 不断地移动右指针
occ.insert(s[rk + 1]);
++rk;
}
// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1);
}
return ans;
}
};
标签:子串,字符,occ,len,dic,ls,ans,最长,rk 来源: https://blog.csdn.net/FeNGQiHuALOVE/article/details/112689066