题目地址:
https://leetcode.com/problems/longest-substring-without-repeating-characters/
给定一个长 n n n的字符串,求其中的一个最长子串不含重复字母,返回其长度。
双指针 + 维护每个字符出现的最后位置。用一个map保存快指针遍历到 j j j的时候 s [ 0 , . . . , j ] s[0,...,j] s[0,...,j]所有字母最后出现的位置,快指针从 0 0 0向后遍历,如果遇到了map里未保存的字符,说明遇到了新字符,子串可以扩展,更新答案并且将该字母和它的位置存入map;否则,说明遇到了重复字符,如果该字符出现在慢指针之后,那么就将慢指针向后移动到该重复字母之前出现的位置+1(也就是map里存储的该字符出现的位置+1),否则不更新慢指针(因为慢指针不能回退,否则就把重复字符加进 s [ i , . . . , j ] s[i,...,j] s[i,...,j]了)。这样就仍然保证了 [ i , j ] [i,j] [i,j]里没有重复元素。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> mp;
int res = 0;
for (int i = 0, j = 0; i < s.size(); i++) {
if (mp.count(s[i])) j = max(mp[s[i]] + 1, j);
res = max(res, i - j + 1);
mp[s[i]] = i;
}
return res;
}
};
时空复杂度 O ( n ) O(n) O(n)。
本文介绍了解决LeetCode上最长子串无重复字符问题的高效算法。通过使用双指针技术和哈希表,算法能在O(n)的时间复杂度内找到给定字符串中最长的无重复字符子串,并返回其长度。
708

被折叠的 条评论
为什么被折叠?



