最长不包含重复字符的子串
用动态规划做
关键是创建一个hash表存储每个字符出现过得最晚位置,当该字符再次出现的时候看这两个字符的距离,如果大于前一个dp值,说明不在前一个dp值的范围之内,那么当前的dp值就是前一个dp值加一,如果在小于前一个dp值,说明在前一个dp之内的长度内出现了重复字符,则当前dp不是最长不含重复字符的子串,,当前dp直接更新为当前位置-hash表中该字符位置。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> m;
int ans = 0, tmp = 0;;
for(int j = 0; j < s.size(); j++){
int i = -1;
if(m.find(s[j]) != m.end()){
i = m[s[j]];
}
m[s[j]] = j;
tmp = tmp < j-i ? tmp +1 :j-i;// dp[j - 1] -> dp[j]
ans = max(tmp, ans);// max(dp[j - 1], dp[j])
}
return ans;
}
};