21xrx.com
2024-11-22 10:21:23 Friday
登录
文章检索 我的文章 写文章
找出不含重复字符的最长子串。
2023-06-08 16:38:50 深夜i     --     --

一、问题描述

给定一个字符串,找出其中不含重复字符的最长子串。

示例 1:

输入: "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

注意你的答案必须是 子串,"pwke" 是一个子序列 而不是子串。

二、解决思路

我们可以通过滑动窗口法来解决这个问题。

(1)定义两个指针,分别为 i 和 j,分别指向子串的开始和结束位置。

(2)用一个哈希表 map 记录每个字符出现的位置。

(3)移动 j 指针,如果当前字符在 map 中不存在,那么将其记录到 map 中,并将 j 指针右移一位;如果当前字符已经在 map 中存在,那么将 i 指针右移至该字符在 map 中出现的位置的下一位,并将该位置后的所有字符从 map 中删除。

(4)在移动 j 指针时,更新不含重复字符的最长子串的长度。

(5)重复上述过程直到 j 指针达到字符串的末尾。

三、代码实现

#include

#include

#include

using namespace std;

class Solution {

public:

int lengthOfLongestSubstring(string s) {

if (s.empty())

return 0;

int res = 1;

int i = 0, j = 0;

unordered_map

while (j < s.size()) {

if (map.find(s[j]) == map.end()) {

map[s[j]] = j;

res = max(res, j - i + 1);

j++;

} else {

i = max(i, map[s[j]] + 1);

map.erase(s[j]);

}

}

return res;

}

};

int main() {

Solution solu;

string s = "abcabcbb";

cout << solu.lengthOfLongestSubstring(s) << endl;

return 0;

}

四、代码解释

(1)判断字符串是否为空,如果是则直接返回 0;

(2)定义不含重复字符的最长子串的长度 res 为 1,i 和 j 分别初始化为字符串的首位位置;

(3)定义一个哈希表 map,用于记录每个字符在字符串中出现的位置;

(4)当 j 指针小于字符串的长度时,如果当前字符不在 map 中,将其记录,并更新 res 的值,j 指针加 1;如果当前字符在 map 中,将 i 指针更新到该字符上一次出现的位置的下一个位置,并将该位置以及之前的所有字符从 map 中删除;

(5)当 j 指针到达字符串末尾时,返回不含重复字符的最长子串的长度 res。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复