我们趁热打铁,再来看看第三题,第三题题目边长了,名字一寸长一寸强,让我们来一起看看这一题是真难,还是纸老虎呢?
关卡三:无重复字符的最长子串
给你一个字符串s,请你找出其中不含有重复字符的最长子串的长度。
我的分析
名字长,题目短,典型有难度题的象征。首先大家不要被想复杂了,题目明确说明了,是让你求子串长度,不是让你求子串,这里最开始我也看错了,所以走了些弯路。看到这种去重的题,首先在我们平常使用最多的去重方法是什么?没错,就是使用HashSet,HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。首先我们可以设置两个索引,然后第一个索引往前找,将找到的元素添加到HashSet中并计数。如果发现重复就删除前面的元素,减去相应的计数,最后取这个计数作为最大值即可,即长度。
public class Solution {
public int LengthOfLongestSubstring(string s) {
HashSet<char> hset = new HashSet<char>();
int l = 0,r = 0; //表示前后索引
int max = 0,count = 0;
while(r<s.Length)
{
if(!hset.Contains(s[r])){
hset.Add(s[r]);
r++;
count++;
}
else
{
hset.Remove(s[l]);
l++;
count--;
}
max = Math.Max(max,count);
}
return max;
}
}