“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
一、题目描述
- 给定一个字符串
s,请你找出其中不含有重复字符的 最长子串 的长度。
二、思路分析
- 首先分析题意,
重点在于子串,也就是连续的- 第一步,
遍历字符串,并创建Map用来存储遍历过的字符 - 第二部,创建
两个指针(快慢指针),快指针每次移动一位,并将当前字符与Map中对比,如果存在则移动慢指针`到存在的下一位。 - 大概思路就是这样
愉快的撸码吧!
- 第一步,
三、AC 代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
//获取字符串长度,定义快慢指针,以及返回值
int n = s.length(), fast = 0, slow = 0, max = 0;
//获取字符串数组
char[] letters = s.toCharArray();
//创建Map用于存储遍历过的字符串
Map<Character, Integer> lastOccurrence = new HashMap<>();
//循环遍历
for( ; fast < n; fast++){
char curr = letters[fast];
//判断当前字符串是否存在
if(lastOccurrence.containsKey(curr)){
//存在则将下标加一
slow = Math.max(slow, lastOccurrence.get(curr) + 1);
}
//不管在不在都存
lastOccurrence.put(curr, fast);
//获取最长字符串
max = Math.max(max, fast - slow + 1);
}
return max;
}
}
四、总结:
- 好了,代码撸完,我们
总结一下:- 这道题的重点在于
快慢指针的运用,以及对于Map的使用 - 细节,要注意最后返回的值要
加一!
- 这道题的重点在于