剑指offer48. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

分析:滑动窗口法,用一个map记录每个字符出现的位置索引,当该字符之前出现过且在当前窗口内,则窗口左端点要右移到该位置。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> mp;
        int n = s.size();
        int start = -1;
        int maxlen = 0;
        
        for (int i = 0; i < n; ++i) {
// 如果mp里已经存在s[i],s[i]可能在当前窗口内,也可能不在,取决于和start的相对位置 // 因此用二者的较大值更新start的位置 if (mp.count(s[i])) { start = max(start, mp[s[i]]); } // 更新s[i]位置索引 mp[s[i]] = i; maxlen = max(maxlen, i - start); } return maxlen; } };

 

posted @ 2020-04-09 18:00  betaa  阅读(138)  评论(0编辑  收藏  举报