无重复字符的最长子串 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;
}
posted @ 2022-10-04 19:37  danieldai  阅读(24)  评论(0编辑  收藏  举报