今日心情:不知道该说些什么麻了
题目描述:
LeetCode 剑指 Offer 48. 最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
解题代码:
- class Solution {
- public int lengthOfLongestSubstring(String s) {
- int left = -1;
-
- int maxSub = 0;
-
- Map<Character,Integer> map = new HashMap<>();
-
- for(int i = 0 ; i < s.length();i++){
- char c = s.charAt(i);
-
- if(map.containsKey(c)){
- left = Math.max(left,map.get(c));
- }
- map.put(c,i);
- maxSub = Math.max(maxSub,i-left);
- }
- return maxSub;
- }
-
- }
解题思路:
双指针+哈希表
(1)HashMap哈希表用于判断当前字符是否重复字符 map.containsKey(c)
(2)如果当前字符已经存在于表中,说明当前移动指向的字符为重复字符,此时从map中获取其相同字符之前的位置,更新左边界位置 left 到 前一个重复字符的位置上。(⚠️ 注意 left 的起始点设置为-1: 因为如果left等于0,在之后遇到与下指标为0的空字符的时候,返回0, 而实际上需要返回1,一个空字符也满足不重复条件,设置 left 为-1之后,当 s == " " 的时候 maxSub的值返回为1,满足要求)
(3)然后更新该字符当前的位置 map.put(c,i)
(4)然后更新最大不重复子字符串的长度 maxSub = Math.max(maxSub,i-left)
即当前重复字符到它上一个相同字符的距离
(5)最后循环结束,返回最大不重复距离值maxSub。