无重复字符的最长子串(哈希表,队列)

  • Post author:
  • Post category:其他


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

示例 1:

输入: s = “abcabcbb”

输出: 3

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

示例 2:

输入: s = “bbbbb”

输出: 1

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

示例 3:

输入: s = “pwwkew”

输出: 3

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

请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。

提示:

0 <= s.length <= 5 * 104

s 由英文字母、数字、符号和空格组成

解题思路:

用队列存储子串,用哈希表标记队列中的元素

遍历数组,从数组第一个元素入队

如果队列中存在与入队元素相同的元素比如[abca],则把队中最左边相同元素和其左边元素出队,比如[abca]→[bca]

如果队列中不存在与入队元素相同的元素,则用哈希表标记入队元素的值为true

用变量length记录最大子串长度(具体实现看代码)

代码:

class Solution {

public:

int lengthOfLongestSubstring(string s) {

if(s.size()==0) return 0;//排除s为空的情况

unordered_map<char,bool> map; //哈希表

queue<char> q;  // 队列

// count 记录子串长度,length记录最大子串

int count=0,length=0;

for(char c : s) {  // 遍历数组s

// 如果队列已存与入队元素在相同元素

if(map[c]==true) {

// 把相同元素之前的元素出队

while(q.front()!=c) {

// 出队元素的值从哈希表中删除

map.erase(q.front());

q.pop();

count–;  // 子串元素个数更新

}

q.pop();  // 相同元素出队(上面没出)

q.push(c);  // 入队元素入队

}

else {  // 队列中不存在相同元素

map[c]=true; // 哈希表标记该元素

q.push(c);  // 该元素入队

count++;  // 子串长度更新

}

// length记录最大子串长度

if(length<count)

length=count;

}

return length; //返回最大子串长度

}

};

建议:可以自己带入题目的例子推一遍。

fd783d8dc3164641afa5ffbd11fae9d5.png



版权声明:本文为weixin_61898526原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。