读取最长的子字符串的长度
#include<iostream>
#include<string>
using namespace std;
int main() {
string s;
cin>>s;
// last数组用来记录字符上一次出现的位置
int last[128];
for (int i = 0; i < 128; i++) {
last[i] = -1; //必须初始化为-1,因为下面有last[index]+1的必要存在,
}
int n = s.length();
int res = 0;//记录最长子字符串的长度
//只读取开头位置和长度,不读取结尾字符的位置 ,每当读到出现过的字符
//【注意,字符是会一直更新上一次出现过的位置的!!】 ,就重新开始读取新的字符串,
int start = 0; // 窗口开始位置
for (int i = 0; i < n; i++) {
int index = s.at(i); //依次查找每一个字符的下标,并转换为ASCII值!!!
start = max(start, last[index]+1); //若在当前子串中出现过(即:(last[index]+1)>start),否则last[index]+1是等于0的),则start移动到出现位置+1,即重新开始读取新的字符串
//只需加一,因为如果,在从start开始的字符串出现过现在未知的字符串last[index]的值本来就是大于等于start的值的
//如果再次出现,则加1就会大于start,所以只需加1就行了
res = max(res, i - start + 1); //更新最大长度(长度为i-start+1),因为是取最大值,所以重新取的字符串如果长度小于原来的长度,则res是不会更改的
last[index] = i; //更新每一个字符的出现位置
}
cout<< res;
return 0;
}