原题链接:无重复字符的最长子串
题意:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
思路
暴力枚举:
- [i,j]可以记录一个区间,如果暴力枚举的话,就成了n个人之间任取两个人握手的问题,则算法复杂度为 O ( n 2 ) O(n^2) O(n2)
哈希表+双指针算法优化:
- 枚举出以j为结尾的区间,使得
[i,j]
为无重复字符的最长子串。如果j++
后使得[i,j]
不满足为无重复字符的最长子串,则必定要i++
,直到满足条件 - 对字符的个数统计使用
unordered_map
完成 cnt
用于个数统计,每次取cnt
与j-i+1
的最大值更新
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int> mp;
int cnt=0;
for(int i=0,j=0;j<s.size();j++)
{
mp[s[j]]++;
while(mp[s[j]]>1)
{
mp[s[i]]--;
i++;
}
cnt=max(cnt,j-i+1);
}
return cnt;
}
};