算法练习-无重复最长序列

46 阅读1分钟

题目是求字符串中无重复字符的最长序列。

思路

滑动窗口:检查窗口内子串是否有重复字符。

当字符串超长时,超时未能通过,此时需要一点点优化,即:

当窗口内不满足条件时,只移动左边界,使得右边界不需要反复更新。

进一步优化

检查窗口是否存在重复子串时有重复计算,如果只检查新字符是否重复就好了(需要在子串移动左边界时删除左边界的map值)。

实现

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.length() < 2) { return s.length(); }
        int left = 0, right = 0;
        int maxLength = 1;
        unordered_set<char> mapping;

        while (right < s.length()) {
            if ( mapping.find(s[right]) == mapping.end() ) {
                mapping.insert(s[right]);
                maxLength = max(maxLength, (right - left + 1));
                right++;
            }
            else {
                mapping.erase(s[left]);
                left++;
            }
        }
        return maxLength;
    }
};