题目描述:
给定一个字符串,找到最长的子串,要求该子串中没有重复的字符。
例如:
字符串abcabcbb的不含重复字符的 最长 子串为abc,长度为 333。
而bbbbbb的不含重复字符的 最长 子串为b,长度为 111。
输入格式
输入包含多行,每一行对应一个长度不超过 100100100 的输出,直到遇到结束符为止。每行依次输入字符串s。
输出格式
输出不含重复字符的 最长 子串的长度。
样例输入
hchzvfrkmlnozjk
样例输出
11
题目分析:求解最长不重复子串的长度。
方法分析:hash
#include <iostream>
#include <cstring>
using namespace std;
int s[256];
int hash1(string x)
{
int maxnn=0;
int start1=0;
for(int i=0;i<x.length();i++){
if(s[x[i]]==-1){
s[x[i]]=i;
}//没有映射就添加映射关系
else{//已经遇到重夊字符了
if(maxnn<i-start1){//当前长度比较
maxnn=i-start1;
}
for(int j=start1;j<s[x[i]];++j) s[x[j]]=-1; // 这部分变成没出现过
start1=s[x[i]]+1;//更新起点,头指针向后移动一位
s[x[i]]=i;//更新字符出现位置,去除前面相同字符的映射关系
}
}
if(x.length()-start1>maxnn) maxnn=x.length()-start1; // 从start1到最后的串是不重复子串
return maxnn;
}
int main() {
string str;
while(cin>>str){
memset(s,-1,sizeof(s));
cout<<hash1(str)<<endl;
}
return 0;
}