Leetcode 03无重复字符的最长子串(c++和python)

题目: 

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

示例 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值