无重复字符的最长子串 leetcode 3 C++ 滑动窗口
C++ 版本的滑动窗口解决方案
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty()) return 0;
unordered_map<char,int> sub_map;
int left=0;
int right = 0;
int max_len = 1;
while(right < s.size()){
// 如果在已经存在的字符中找到该字符,更新该字符的新位置,并且计算在此之前的不重复子串的长度,进行取极大值。 if(sub_map.find(s[right])!=sub_map.end()) {
if(sub_map[s[right]]>= left){
max_len = max_len > (right - left) ? max_len : right - left;
left = sub_map.at(s[right])+1;
}else{
}
}
sub_map[s[right]] = right;
right++;
}
max_len = max_len > (right -left ) ? max_len:right-left;
return max_len;
}
};
//C语言版本 ,不使用unordered_map ,因为是普通字符串,可以将字符当成数组下标存储起来 ,使用C语言,双指针的滑动窗口 版本
int lengthOfLongestSubstring(char * s){
if(!*s) return 0;
int sub_char[256] = {0};
int left = 0;
int right = 0;
int max_len = 0;
char *p = s;
while(*p){
if(sub_char[*p]){
if(sub_char[*p] -1 >= left){
// 目前的子序列已经重复了
max_len = max_len > right-left? max_len : right-left ;
left = sub_char[*p];
}
}
sub_char[*p] = right+1;
p++;
right++;
}
max_len = max_len>right-left ? max_len:right-left;
return max_len;
}