Leetcode_Longest Substring Without Repeating Characters

本文提供了一种使用deque和map的数据结构解决LeetCode上的最长无重复字符子串问题的方法,并给出了C++及Python两种实现方式。通过前后指针技巧,结合hash表快速查找,高效地找到了字符串中不含有重复字符的最长子串长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode倒数第三题,地址:http://oj.leetcode.com/problems/longest-substring-without-repeating-characters/

思路:用deque和map来模拟,从后插入deque,同时map存一份表示此char已存入,当发现当前char已存入deque的时候,从deque的front开始pop,知道把与当前char相同的char 给pop出去,同时map也做维护,当q的size最大时,也就是要返回的值。


形象上就是两个指针一前一后在移动,有char进来并不与两指针之间的char重复的时候,后指针移动(往后),否则前指针移动(往后)到重复char的后一位置。map维护快速查询。


参考代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int maxlen = 0, len = 0;
        deque<char> q;
        map<char, bool> resmap;
        for(int i = 0; i < s.length(); ++i)
        {
            auto it = resmap.find(s[i]);
            if(it == resmap.end())
            {
                ++len;
                q.push_back(s[i]);
                maxlen = maxlen > len ? maxlen : len;
                resmap.insert(pair<char,bool>(s[i], true));
            }
            else
            {
                while(!q.empty() && q.front() != s[i])
                {
                    auto deleteIt = resmap.find(q.front());
                    resmap.erase(deleteIt);
                    q.pop_front();
                }
                q.pop_front();
                q.push_back(s[i]);
                len = q.size();
            }
        }
        return maxlen;
    }
};


SECOND TRIAL, 204MS

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.empty())
            return 0;
        unordered_map<char, int>mp;
        unordered_map<char, int>::iterator it;
        int i = 0, mlen = 0;
        for(int k = 0; k<s.length(); ++k)
        {
            it = mp.find(s[k]);
            if(it == mp.end())
                mp[s[k]]=k;
            else
            {
                while(s[i]!=s[k])
                {
                    it = mp.find(s[i]);
                    mp.erase(it);
                    ++i;
                }
                ++i;
            }
            mlen = max(mlen, k-i+1);
        }
        return mlen;
    }
};


PYTHON VERSION, 392MS

class Solution:
    # @return an integer
    def lengthOfLongestSubstring(self, s):
        if not s:
            return 0
        d = {}
        maxlen = i = 0
        for j in range(0, len(s)):
            if not d.has_key(s[j]):
                d[s[j]] = j
            else:
                while s[i] != s[j]:
                    del d[s[i]]
                    i+=1
                i+=1
            maxlen = max(maxlen, j-i+1)
        return maxlen


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值