3. 无重复字符的最长子串

2021-04-23  本文已影响0人  乘瓠散人

题目:给定一个字符串,找出其中不含重复字符的最长子串的长度。比如'abba'的最长子串长度为2。
思路:假设我们选择字符串中第k个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为r,那么当选择第k+1个字符为起始位置时,首先从k+1到r之间的字符显然是不重复的,并且由于少了原本的第k个字符,可以尝试增大r,直到出现了重复字符为止。
因此用滑动窗口实现,使用两个指针表示字符串中某个子串(窗口)的左右边界。在每一步操作中,将左指针右移一格,表示开始枚举下一个字符作为起始位置,然后不断右移右指针,直到出现了重复字符,记录下当前(窗口)子串的长度。最后返回最长的子串长度。

int lengthOfLongestSubstring(string s) {
    unordered_set<char> st;
    int res = 0;
    int right = 0;

    for (int i=0; i<s.length(); i++) {
        while (right < s.length() && st.count(s[right])==0) {
            st.insert(s[right]);
            right++;
        }
        int cnt = right - i;
        if (cnt > res) res = cnt;

        st.erase(s[i]);
    }
    return res;
}

上一篇下一篇

猜你喜欢

热点阅读