无重复字符的最长子串
题目介绍
题目链接:3. 无重复字符的最长子串 - 力扣(Leetcode)
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题目思路
没啥好说的,一眼滑动窗口。。。
以示例1为例,对于“abcabcbb”,定义两个指针( left 和 right ),初始都指向字符串0位置,两个指针之间的字符串即为当前找到的子串,right指针向右遍历,使用hashmap记录出现过的字符和字符最后一次出现的位置,当前字串出现重复字符时(即hashmap中存在当前right指向的字符),将left指针移动到重复字符的下一个位置即可(map.get(s.charAt(i)) + 1),遍历过程中记录字串长度最大值。
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length() <= 1){
return s.length();
}
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int ans = 0;
int left = 0;
for(int i = 0; i < s.length(); i++){
if(map.containsKey(s.charAt(i))){
left = Math.max(left, map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
ans = Math.max(ans, i-left+1);
}
return ans;
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mercury个人博客!
评论