最长无重复子串
思路1:利用滑动窗口,先开辟一个数组,里面存放字符串中每个字符出现的次数。如果s[i]第一次出现,那就把窗口后沿向后移动,若s[i]出现第二次,就把它的计数减1,同时窗口前沿移动一位。
#include<iostream>
using namespace std;
#include <string>
#include <stdlib.h>
#include <algorithm>
string s;
int main()
{
int vis[256]={0};
int l=0,r = -1;//s[l-r]滑动窗口维护该区间
int res = 0;
cin>>s;
int s_size = s.size();
while(l<s_size)
{
if(r+1 <s_size && vis[s[r+1]]==0)//下一个结点有没有visit
{
r++;
vis[s[r]]++;
}
else
{
vis[s[l]]--;
l++;
}
res = max(res, r-l+1);
}
cout<<res;
system("pause");
return 0;
}
思路二: 如果是第一次出现,就记录出现的位置,再记录长度,继续向后遍历;遇到重复的字符,将现在的位置和上一次出现重复字符的位置进行比较,取较大的位置
#include<iostream>
using namespace std;
#include <string>
#include <stdlib.h>
#include <algorithm>
#include <unordered_map>
int main()
{
string A;
while(cin >> A)
{
int size = A.length();
int res = 0;
unordered_map<int, int> map;
for(int start = 0, end = 0; end < size; end++)
{
if(map.count(A[end])) //不是第一次出现的位置
{
start = max(start, map[A[end]]); // 将前一次出现重复字符的位置和现在的位置进行比较,取较大的位置
}
map[A[end]] = end+1; //记录第一次出现的位置
res = max(res, end - start + 1); //求出长度
}
cout << res << endl;
}
return 0;
}