[算法笔记]leetcode03 最长无重复字符字串
leetcode03(最长无重复字符字串)
[!NOTE] 题目
给定一个字符串s,请你找出其中不含有重复字符的 最长 子串 的长度。
链接:3. 无重复字符的最长子串 - 力扣(LeetCode)
解题思路:
使用滑动窗口加哈希表M来求解。从左到右遍历字符串 i->(0,s.length()-1),哈希表保存字符对应的index,同一个字符保留最新的index。同时维护子串开始的start_index和最长字符串长度max_l。
情况
- 情况1:字符不在哈希表M中,说明该字符第一次遇到,不在该字串中。
- 情况2:遍历过程中,字符在哈希表M中并且是大于字串开始下标start_index,说明该字符在该子串内重复。
- 情况3:遍历过程中,字符在哈希表M中但是其index 小于start_index。
操作
对于情况1: 继续遍历该子串。看max_l 是否需要更新
对于情况2:更新子串开始的start_index为 map[重复字符] + 1,重开一个新的子串
对于情况3: 继续遍历该子串。看max_l 是否需要更新
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int start_index = 0;
int max_l = 0;
unordered_map<char,int> charLastIndexMap;
for(int i = 0;i<s.size();i++){
if(charLastIndexMap.find(s[i])!= charLastIndexMap.end() && charLastIndexMap[s[i]]>=start_index){
start_index = charLastIndexMap[s[i]] +1;
}
charLastIndexMap[s[i]] = i;
if (max_l<i-start_index+1){
max_l = i-start_index+1;
}
}
return max_l;
}
};
int main(){
string str1 = "aab";
Solution s;
cout<<s.lengthOfLongestSubstring(str1);
return 0;
}

浙公网安备 33010602011771号