3.8 一轮练习hot100(3. 无重复字符的最长子串 22. 括号生成 )

文章详细介绍了两个编程问题的解法:一是使用哈希表和双指针找到字符串中最长的无重复字符子串;二是通过动态规划生成所有有效的括号组合。讨论了关键的编程思路和优化技巧。
摘要由CSDN通过智能技术生成

题一:3. 无重复字符的最长子串

在这里插入图片描述

链接

题目链接:
官方答案:

关键点

编程思路

Me:
  1. 错误思路:遇到重复后,跳到已储存的索引的下一个位置 错例:abbccad

力扣实战

思路一:官方思路1

 class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
            #看完官方思路一后手撕代码
        start = 0   #记录当前无重复子串的起点
        maxlen =0   #记录最长无重复子串的长度
        hash = {}   #哈希表,key为值,val为索引,用于判断以当前start为起点的字符串有没有重复,如果有清空hash,换起点
        for start in range(len(s)):
            if len(s)-start+1<=maxlen:  #剪枝操作,若起点太靠后,可以结束查询
                break
            for ind,val in enumerate(s[start:]):    #
                if val in hash.keys():  #若出现了重复,说明当前为起点的字符串出现了重复,需要换起点了
                    hash.clear()
                    break
                else:
                    hash[val]=1
                    maxlen = max(maxlen,ind+1)  #切片字符串的ind已经不是源字符串的索引,所以更新长度时需注意
        return maxlen   #aabbaacc   abbccad
        
# 反思1:

在这里插入图片描述

思路二: 优化版,左右指针只往右移动

 class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        # 哈希集合,记录每个字符是否出现过
        occ = set()
        n = len(s)
        # rk为右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        rk, ans = -1, 0
        for i in range(n):	#i为左指针
            if i != 0:
                # 左指针向右移动一格,移除一个字符
                occ.remove(s[i - 1])
            while rk + 1 < n and s[rk + 1] not in occ:	#abcabcbb
                # 不断地移动右指针
                occ.add(s[rk + 1])	#set用add函数加入
                rk += 1
            # 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = max(ans, rk - i + 1)
        return ans


题二:22. 括号生成

链接

题目链接:
文章链接:

关键点

  1. 最关键的是只有一种括号,所以无效的情况只有两种:左右括号数量不一样;出现了)(,也就是先有了)

编程思路

Me:

力扣实战

思路一:动态规划

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
   	#考虑在已知i-1组括号分布时。第i个括号的分组的分析
        dp =[[]for i in range(n+1)] #dp[i]表示i组括号的所有有效组合,第0组有0个有效,所以
        dp[0]=[""]  #需要创建n+1个空括号来存放结果
        for i in range(1,n+1):  #处理第i组括号的情况
            for p in range(i):
                q = i-1-p
                l1 = dp[p]
                l2 = dp[q]
                for a in l1:
                    for b in l2:
                        dp[i].append("({0}){1}".format(a,b))
        return dp[n] 
        
# 反思1:fotmat作为Python的的格式字符串函数,主要通过字符串中的花括号{},来识别替换字段,从而完成字符串的格式化。
"({0}){1}".format(a,b) 为 “(a)b”

思路二:其他思路不会

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值