最长不含重复字符的子字符串

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

思路:

设字符串为s,dp[i]表示以下标i为结尾字符串最长子字符串的长度。则dp[i]=dp[i-1]+1,i的前dp[i-1]个字符串中没有与s[i]重复的。dp[i]=min(i-j,dp[i-1]+1),j表示i的前dp[i-1]个字符串中与s[i]重复的字符下标。用一个unordered_map记录字符的下标。

代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int length = s.size();
        if(length == 0) return 0;
        vector<int> dp(length);
        dp[0] = 1;
        unordered_map<char,int> indexMap;
        indexMap[s[0]] = 0;
        int maxL = 1;
        for(int i = 1;i < length;i++) {
            if(indexMap.find(s[i]) == indexMap.end()) {
                dp[i] = dp[i-1]+1;
            }
            else {
                dp[i] = min(i - indexMap[s[i]],dp[i-1]+1);
            }
            indexMap[s[i]] = i;
            maxL = max(maxL,dp[i]);
        }

        return maxL;
    }
};