求无重复字符串的最大子串(滑动窗口,哈希优化,桶优化)力扣第三题

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        /*滑动窗口方法*/
        /*
        原理:
        指针start,end分别指向子串的首尾,end不断向末尾扩展
        tmChar记录当前子串end新移动到的位置的值
        若在start~end-1中找到了等同于tmChar时说明出现了重复元素
        这时start调整到tmpChar的下一个元素
        比较新子串与老子串的长度
        */
        int start = 0, end = 0, length = 0, result = 0;
        int sSize = int(s.size());

        while(end < sSize){
            char tmpChar = s[end];
            for(int index = start; index < end; index++){
                if(tmpChar == s[index]){
                    start = index + 1;
                    length = end - start;
                    break;
                }
            }
            end ++;
            length ++;
            result = max(result, length);
        }
        return result;
    }
};

/*
int lengthOfLongestSubString(String s){
    int start = 0, end = 0, length = 0, result = 0;
    int sSize = s.size();
    unordered_map<char, int> hash;//创建哈希表
 //思路,start~end之间一定没有重复元素,end向右移动过程中将元素添加入哈希表,每移动一个元素判断哈希表中是否存在该元素,若存在说明当前end位置是重复元素,则start调整到该元素的下一个位置,end调整到该位置,重复,若在哈希表中没有出现,则证明成立,子串长度加一
    while(start < end){
        char tmpChar = s[end];//当前子串末尾元素
        if(hash.find(tmpChar) != hash.end() && hash.find(tmpChar) > start)//假如在当前子串的右侧出现了新的tmpChar元素{
            start = hash[tmpChar] + 1;//新子串的起始位置调整
            length = end - start;//当前子串的长度
        }
        hash[tmpChar] = end;
        length ++;
        result = max(result, length);
    }

    return result;
}
*/

/*
 int lengthOfLongestSubstring(string s)
    {
        //s[start,end) 前面包含 后面不包含
        int start(0), end(0), length(0), result(0);
        int sSize = int(s.size());
        vector<int> vec(128, -1);//定义一个128位初始化为-1的容器
        while (end < sSize)
        {
            char tmpChar = s[end];
            //仅当s[start,end) 中存在s[end]时更新start
            if (vec[int(tmpChar)] >= start)
            {
                start = vec[int(tmpChar)] + 1;
                length = end - start;
            }
            vec[int(tmpChar)] = end;

            end++;
            length++;
            result = max(result, length);
        }
        return result;
    }

*/
发布了43 篇原创文章 · 获赞 44 · 访问量 6598

猜你喜欢

转载自blog.csdn.net/qq_41582910/article/details/105061453