思想方法如下:
假设原始字符串S如下
从左侧开始遍历S,以i标记窗口左侧,j标记窗口右侧,初始时,i=0,j=0,即开头a所在的位置,此时,窗口大小为1
然后,将j右移,逐步扩大窗口,依次经过b、c、d,此时,窗口内均无重复字符,继续右移j
找到窗口中已存在的该字符所在位置,并将i
移动到该位置下一位
此时为第二个窗口
继续重复之前的操作,直到j
移动到字符串最后一位停止。
eg1:最长无重复字串
// 最长无重复子串.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
string s;
while (getline(cin, s))
{
int hash[127] = { 0 };
int i = 0, j = 0;
int len = s.length();
int max = 0;//不重复字串长度
while (i < len && j < len)
{
if (hash[s[j]] == 0)
{
hash[s[j]] = 1;
j++;
max = (j - i) > max ? (j - i) : max;
}
else
{
hash[s[i]] = 0;
i++;
}
}
cout << max << endl;
}
return 0;
}