题目:
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是 "abc",其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是 "b",其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 无重复字符的最长子串是 "wke",其长度为 3。
请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。
思路:
利用队列,先进先出。将字符依次入队,入队前,查看当前队列里面是否已存在将要入队的字符,如果存在,则开始出队,一直出队到把重复的字符出对为止,这个过程中一直更新记录最大队列长度。
举个栗子
(1)字符串: abcb,当前队列:abc,将要入队的字符: b,则要出队的元素为: ab,把重复的字符出对,这样队列的元素就变成:cb,最大队列长度为3;
(2)字符串: abcbefg, 当前队列为:abc,将要入队的字符:b,则要出队的元素为: ab,这样队列的元素就变成:cb,再继续入队efg,队列变成:cbefg,则最大队列长度为5.
C++代码:
#include<string>
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<char> queue;
int p = 0; //遍历字符串
int max_len = 0; // 最长字串长度
// 遍历s
while (p < s.size())
{
// 一直找到队尾(end),说明没有队列中不存在该字符
if (std::find(queue.begin(), queue.end(), s[p]) == queue.end())
{
queue.insert(queue.end(), s[p++]); // 插入队尾
max_len = max(max_len, (int)queue.size()); // 更新最长长度
}
else // 在队列中存在
{
// 从对头开始出队,一直到把相同元素出队
queue.erase(queue.begin()); // 不会进入if语句,这个会重复运行,直到删除重复的字符
}
}
return max_len;
}
};
int main(){
string s = "abcabcbb";
Solution so;
int max_len = so.lengthOfLongestSubstring(s);
}
python代码:
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
queue_list = []
max_len = 0
rear = 0
# 遍历字符串
while rear < len(s):
# 判断当前字符是否存在于队列中
if s[rear] not in queue_list:
queue_list.append(s[rear])
max_len = max(max_len, len(queue_list))
rear = rear + 1 # 字符串的下一个
else: # 存在,则删除队头元素,直到把相同的元素也删除
del queue_list[0] # 不会进入if语句,这个会重复运行,直到删除重复的字符
return max_len