请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
思路:
设字符串为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;
}
};