3. 无重复字符的最长字串(中等)
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
1、C++
利用i,j遍历字符串,i,j分别表示无重复字符串的首尾下标。book记录所遍历的无重字符串中的那些字符存在。 i,j均从0开始,当s[j]与字符串s[i,j]中的某一字符s[k]相同时,记录此时的子字符串长度,然后将i++至k+1,然后将原i~k-1的字符标记置零。
利用桶优化:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i = 0, j = 0, len = s.length();
int maxlen = 0;
int book[256] = {0};
while(j < len) {
if(book[s[j]] == 1) {
maxlen = max(maxlen, j - i);
while(s[i] != s[j]) {
book[s[i]] = 0;
i++;
}
i++;
} else {
book[s[j]] = 1;
}
j++;
}
maxlen = max(maxlen, j - i);
return maxlen;
}
};
利用哈希:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i=0 ,j=0, n=s.length();
int muxlen=0;
unordered_map<char,int> m;
for(j=0 ; j<n ; j++){
auto it = m.find(s[j]);
if(it == m.end()){
m[s[j]]=j;
}
else{
muxlen = max(muxlen,j-i);
int k = m[s[j]];
for(int e=i;e<k;e++){
m.erase(s[e]);
}
m[s[j]]=j;
i = k+1;
}
}
muxlen = max(muxlen,j-i);
return muxlen;
}
};
2、python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
i,j = 0,0
temp = {}
n = len(s)
muxlen = 0
while(j<n):
if s[j] in temp:
muxlen = max(muxlen,j-i)
while(s[i]!=s[j]):
temp.pop(s[i])
i=i+1
temp[s[i]]=j
i=i+1
else:
temp[s[j]] = j
j=j+1
muxlen = max(muxlen, j-i)
return muxlen