1、题目描述
给定一个字符串s,找出至多包含k个不同字符的最长子串T。
示例:
输入:s = “eceba”,k = 2
输出:3
解释:则T为"ece",所以长度为3
2、思路方法
使用滑动窗口
3、代码
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<math.h>
using namespace std;
int lengthOfLongestSubstringDistinct(string s,int k)
{
int len = s.size();
if(len==0 || k<=0)
return 0;
int l = 0;
//int max_l = l;
int max_len = 0;
int nums[128];//记录是否出现了字符
memset(nums,0,sizeof(nums));
int cnt = 0;
for(int r = 0;r<len;++r)
{
if(nums[s[r]]==0)//之前还没有遇到该字符
{
cnt++;
}
nums[s[r]]++;
//if(cnt==k)
//max_len = max(max_len,r-l+1);
while(cnt>k)//只有当字符的数量超过限定的数量的时候才开始对左边界进行操作
{
if(nums[s[l]]==1)
cnt--;
if(nums[s[l]]>0)//如果是已经计算的字符
nums[s[l]]--;
//cout<<"nums[l]:"<<l<<" "<<nums[s[l]]<<endl;
l++;
}
//是至多,不一定非要是k
max_len = max(max_len,r-l+1);
}
return max_len;
}
int main()
{
string s = "eceba";
int k = 2;
//string s = "aa";
//int k = 1;
cout<<lengthOfLongestSubstringDistinct(s,k)<<endl;
return 0;
}