给定一个字符串 ,如何查找无重复字符的最长子串
算法题目:给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
我的解题思想:
1.用双指针作滑动窗口,初始值都为0,起点相同
2.用右指针遍历字符串
3.先滑动右指针,把右指针的元素和索引添加到哈希表,直到出现重复值。如果不是重复值,则记录窗口长度。
4.匹配到重复值时,要比较左指针的位置。当左指针位于左边时,把左指针滑到原本元素位置的右侧第一个,开启下一个窗口。比如“dvdf”中匹配到d,左指针滑到v。“abba” 中做匹配到重复a时左指针不能动。
我的核心代码:
int left = 0;
int right = 0;
int currentLength = 0;
int maxLength = 0;
Map<Character,Integer> map = new HashMap<>();
// 滑动右指针遍历字符串
while(right < s.length())
{
//获取字符串中指定索引位置的字符
char c = s.charAt(right);
//在哈希表里匹配是否已经存在该字符
if(map.containsKey(c))
{
//如果发现重复元素,必须先比较左指针与哈希表里元素的位置关系!!当左指针位于哈希表位置的左侧时,才能滑动左指针,开启新窗口。右指针不动。
left = Math.max(left,map.get(c) + 1);
}
//添加新元素到哈希表,或者更新重复元素的最新位置
map.put(c,right);
//判断完不是重复值后,才能计算窗口长度,不然会多算一个长度
currentLength = right - left + 1;
maxLength = Math.max(currentLength,maxLength);
//移动右指针,直到右指针遍历完字符串
right++;
}
return maxLength;
所有正文内容皆为本人原创,禁止搬运

浙公网安备 33010602011771号