题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
解题思路
直接建立一个ASCII码的hash表,出现就往对应的空间里将0改为是当前长度,例如:
对串dcba,其对应的hash表为:
a | b | c | d | e |
---|---|---|---|---|
4 | 3 | 2 | 1 | 0 |
如果出现重复字符,就如下更新:例如dcbac
a | b | c | d | e |
---|---|---|---|---|
2 | 1 | 3 | 0 | 0 |
将小于重复字符的值变为0,例如d对应的1小于c对应的2,
将大于重复字符的值减去重复字符的值,例如a对应的4变为2,
最后更新c的值
实现代码
int lengthOfLongestSubstring(char * s){
int hash[128]={0};
int i=0;
int count=0;
int max=0;
while(s[i]!='\0'){
int j=s[i];
if(hash[j]==0){
count++;
if(max<count){
max=count;
}
hash[j]=count;
}else{
int temp=hash[j];
int k=0;
count=0;
for(k=0;k<128;k++){
if(hash[k]>temp){
hash[k]-=temp;
count++;
}else{
hash[k]=0;
}
}
hash[j]=++count;
}
//printf("%d",count);
i++;
}
return max;
}
反思
这个问题好像在算法导论课上讲过,但不记得是怎么实现的了。看了一下题解,应该是题解所说的方法:
定义两个指针,指在不重复序列的一头一尾,然后尾指针向后移,通过hash表查找移后包含的字符是否已经出现过,没有出现过就继续向后移动,出现过就移动前指针到合适的位置,长度直接用后指针减去前指针就行。