剑指 Offer 48. 最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
k神讲解参考
方法一:动态规划 + 哈希表
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> mp;
int res = 0, tmp = 0, i;
for(int j = 0; j < s.size(); j++){
if(mp.find(s[j]) == mp.end()) i = -1;
else i = mp[s[j]];
//cout<<i;
mp[s[j]] = j;
tmp = tmp < j - i ? tmp + 1 : j - i;
res = max(res, tmp);
}
return res;
}
};
方法二: 动态规划 + 线性遍历
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int res = 0, tmp = 0;
for(int j = 0; j < s.size(); j++){
int i = j - 1;
while(i >= 0 && s[i] != s[j]) i--;
tmp = tmp < j - i ? tmp + 1 : j - i;
res = max(res, tmp);
}
return res;
}
};
方法三:双指针 + 哈希表
,没太看懂,大致意思就是不断取两个一样的字符之间夹着的子串,然后找最大的
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> mp;
int i = -1, res = 0;
for(int j = 0; j < s.size(); j++){
if(mp.find(s[j]) != mp.end()){
i = max(i, mp[s[j]]);
}
mp[s[j]] = j;
res = max(res, j - i);
}
return res;
}
};