题目:我有一个字符串s,求这个字符串中的一个子字符串,要求这个子串的所有字符不能有重复。
这就是一个典型的滑动窗口问题,只要我们找到窗口的end和最大长度(知道end和maxLen就能算出start)就可以求得子字符串最大长度了
实现步骤:
① 定义一个set
② 遍历s,如果当前字符c在set中没有,则将c放入set中,并判断滑动窗口的end是否需要移动
③ 如果在set中有,则要移动start到当前字符的下一个为止,而且还要earse集合中的元素
④ 最后end - maxLen + 1为滑动窗口的起点,substr(end - maxLen + 1,maxLen)。
见代码
#include <iostream>
#include <string>
#include <set>
using namespace std;
string lengthOfLongestSubstring(string s)
{
if(s == "") return "";
int start,end;
start = end = 0; // 滑动窗口的起始位置
size_t maxLen = 0;
set<char> set;
for(size_t i = 0;i < s.size();++ i)
{
if(set.find(s[i]) == set.end())
{
// 表示在set里没找到对应的值
set.insert(s[i]);
if(set.size() > maxLen)
{
maxLen = set.size();
end = i;
}
}
else
{
// 在set里找到了对应的值
while(s[start] != s[i])
{
set.erase(s[start]);
++ start;
}
++ start;
}
}
return s.substr(end - maxLen + 1,maxLen);
}
int main(int argc, char const *argv[])
{
string s = "dvdf";
cout << lengthOfLongestSubstring(s) << "\n";
return 0;
}