Loading

[算法笔记]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;
}
posted @ 2026-03-08 00:03  GIPV  阅读(1)  评论(0)    收藏  举报