给定一个字符串,找到最长的子串,要求该子串中没有重复的字符。
例如:
字符串abcabcbb的不含重复字符的 最长 子串为abc,长度为 3。
而bbbbbb的不含重复字符的 最长 子串为b,长度为 1。
思路都是一样的:记录一个数的初始位置。如果后面出现了同样的字符,就从这个字符下一个相同的位置往下找。
#include<iostream>
using namespace std;
#include<map>
#include<algorithm>
int lengthOfLongestSubstring(string s);
int main()
{
string str = "abcagee";
int max_len = lengthOfLongestSubstring(str);
cout << max_len << endl;
return 0;
}
//如果出现了。先把之前记录的上一个字符 的位置传给pre。之后m[s[i]]=i会更新当前的位置
int lengthOfLongestSubstring(string s) {
map<char, int> mp;
for (int i = 0; i < s.length(); i++)
mp[s[i]] = -1;//初始化哈希表
int pre = -1, Max = 0;
for (int i = 0; i < s.length(); i++) {
pre = max(pre, mp[s[i]]);
Max = max(Max, i - pre);
mp[s[i]] = i;
}
return Max;
}