leetcode_[Python/C++]_3_Longest Substring Without Repeating Characters(不重复子串最大长度)

题目链接
【题意】
给定一个字符串,找到其中的一个最长的字串,使得这个子串不包含重复的字符
【分析】
题目很简单,第一眼想到的是动态规划,另外主要是为了分享一些做法写法


C++

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size()==0) return 0;
        if(s.size()==1) return 1;
        vector<int> chr(256,-1);
        vector<int> dp(s.size(),-1);
        dp[0] = 0;
        chr[s[0]] = 0;
        int max = -10000;
        for(int i=1;i<s.size();i++){
            if(chr[s[i]] == -1){
                dp[i] = dp[i-1];
                chr[s[i]] = i;
            }
            else{
                if(chr[s[i]] < dp[i-1]){
                    chr[s[i]] = i;
                    dp[i] = dp[i-1];
                }
                else{
                    dp[i] = chr[s[i]]+1;
                    chr[s[i]] = i;
                }
            }
            if(i - dp[i]>max)   max = i - dp[i];
        }
        return max + 1;
    }
};

另一种解法:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<int> dict(256, -1);
        int maxLen = 0, start = -1;
        for (int i = 0; i != s.length(); i++) {
            if (dict[s[i]] > start)
                start = dict[s[i]];
            dict[s[i]] = i;
            maxLen = max(maxLen, i - start);
        }
        return maxLen;
    }
};

python:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        curr, res, letter = 0, 0, set()
        for i, ch in enumerate(s):
            while ch in letter:
                letter.remove(s[curr])
                curr += 1
            letter.add(ch)
            res = max(res, i - curr + 1)
        return res

分享一个极其简单的python写法:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        l_substr, l_suffix = '', ''
        for each in s:
            l_suffix, l_substr = each in l_suffix and l_suffix[l_suffix.index(each) + 1:] + each or l_suffix + each, max((l_suffix, l_substr), key=len)
        return len(l_substr)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值