力扣题目链接
题目描述
给定一个字符串s,请你找出其中不含有重复字符串的最长字串的长度。
解题思路
滑动窗口:将右边界向右滑动,若出现重复字符,则将左边界(多次)向右滑动至剔除重复字符,再重复上述步骤将右边界向右滑动至字符串结束。
以字符串 abcba 为例
left=0 right=0,子串 a,hash['a']=1,右移right
left=0 right=1,子串 ab,hash['a']=1,hash['b']=1,右移right
left=0 right=2,子串 abc,hash['a']=1,hash['b']=1,hash['c']=1,右移right
left=0 right=3,子串 abcb,hash['a']=1,hash['b']=1,hash['c']=1,出现重复字符b,右移left,将hash['a']置0
left=1 right=3,子串 bcb,hash['b']=1,hash['c']=1,仍存在重复字符b,右移left,将hash['b']置0
left=2 right=3,子串 cb,hash['c']=1,hash['b']=1,无重复字符,成功将 b 添加至子串,右移right
left=2 right=4,子串 cba,hash['c']=1,hash['b']=1,hash['a']=1,结束
代码
int lengthOfLongestSubstring(char* s) {
int hash[128] = {0}; //用于标记当前子串中的字符
int left = 0; //左边界
int right = 0; //又边界
int len = strlen(s);
int max = 0; //总长
for(right = 0; right < len; right++){
while(hash[s[right]] == 1){
hash[s[left++]] = 0;
}
hash[s[right]] = 1;
if(max < right - left + 1){
max = right - left + 1;
}
}
return max;
}
相关知识点
滑动窗口
滑动窗口讲解(c基础)_滑动窗口如何确定起始和停止的位置-优快云博客
哈希表