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

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例 1:

输入: "abcabcbb"

输出:

解释: 无重复字符的最长子串是 "abc",其长度为 3。

示例 2:

输入: "bbbbb"

输出: 1

 

主要思想:“滑动窗口”,使用一个容器保存遍历的字符。

遍历字符串,同时将不重复的字符保存到窗口中,窗口的右边界加一,相当于向右滑动了一位;当遇到重复字符时,就从窗口的左边界缩小窗口大小,直到容器中不包括该重复字符。本质上也是借助外部空间。

 

解法1:

int lengthOfLongestSubstring(string s)
{
    int n = s.size();
    unordered_set<char> set;
    int max = 0, i = 0, j = 0;
    while (i < n && j < n)
    {
        auto f = set.find(s.at(j));
        if (f == set.end())
        {
            // 右边界向右滑动一位
            set.emplace(s.at(j++));
            max = std::max(max, j - i);
        }
        else
        {
            // 左边界向右缩小一位
            set.erase(s.at(i++));
        }
    }
    return max;
}

 

解法2:

int lengthOfLongestSubstring(string s)
    {
        int n = s.size();
        unordered_map<char, int> mp;
        int max = 0;

        for (int j = 0, i = 0; j < n; ++j)
        {
            if (mp.count(s.at(j)) > 0)
            {
                // 直接将窗口的左侧缩小成重复的字符的下一位
                i = std::max(mp.at(s.at(j)), i);
            }
            max = std::max(max, j - i + 1);
            // 右边界向右滑动一位
            mp.emplace(s.at(j), j + 1);
        }

        return max;
    }

 

posted @ 2018-10-08 17:30  jimobuwu  阅读(174)  评论(0编辑  收藏  举报