LeetCode3.无重复字符的最长子串

LeetCode3.无重复字符的最长子串

难度:中等
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
在这里插入图片描述

双指针

思路;

  • 第一种情况,s只有一个元素或者空子串;
  • 设置双指针left、right,一个指向最左端,一个指向下一个元素;
  • right向右移动cnt记录不重复字串长度;
  • right向右移动,直到right指向的元素在s[left:right]中存在,找到改元素在窗口中的位置,并将left指向该元素的下一个元素;
  • 然后比较cnt 与 right - left的大小;
  • 如果下一个元素不在s[left:right]中,则right加1;
  • 最后要考虑如果最大子串在最后,再做一次比较;
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if len(s) < 2:
            return len(s)
        left, right = 0, 1
        cnt = 1
        while right < len(s):
            if s[right] in s[left:right]:
                left += s[left:right].index(s[right]) + 1
                cnt = max(cnt,right-left) 
            else:
                right += 1
            cnt = max(cnt,right-left)
        return cnt

字典(哈希表)与双指针

  • 创建字典,将字符为键,索引为值保存到字典中;
  • i为左指针,j为右指针;
  • 然后遍历字符串,如果s[j]在字典中,则取值最大的那个;
  • 然后比较ans 和j-i+1,保存最大子串长度;
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        st = {}
        i, ans = 0, 0
        for j in range(len(s)):
            if s[j] in st:
                i = max(st[s[j]], i)
            ans = max(ans, j - i + 1)
            st[s[j]] = j + 1
        return ans

状态规划

  • 初始化,dp[0] = s[0];
  • s[i]不在dp[i-1]中,此时dp[i] = dp[i - 1] + s[i];
  • s[i]在dp[i-1]中,要将s[i]从dp[i-1]中去除,从左往右依次去除元素,直到去除s[i],dp[i]=(dp[i-1] - dp[0:index(s[i])+1)]) + s[i];
  • 最后取出最大的len(dp[i]);
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s:
            return 0
        n = len(s)
        dp = [0] * n
        dp[0] = s[0]
        for i in range(1,n):
            if s[i] not in dp[i-1]:
                dp[i] = dp[i-1] + s[i]
            else:
                tem = dp[i-1].index(s[i])
                dp[i] = dp[i-1][tem+1:] + s[i]
        ans = 1
        for i in range(n):
            ans = max(ans, len(dp[i]))
        return ans 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

他是只猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值