2024.9.9 Python,有效的括号,三数之和,回溯算法解决括号生成

1.有效的括号

给定一个只包括 '(',')','{','}','','' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()\[\]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "(\[\])"

输出:true

方法一:我的方法,遇见就删库

py 复制代码
class Solution:
    def isValid(self, s: str) -> bool:
        stack=[]
        n=len(s)
        if len(s)%2!=0:
            return False
        for i in range(n):
            if s[i] in ('(', '[', '{'):
                stack.append(s[i])
            elif s[i] in (')', ']', '}'):
                if not stack:
                    return False
                elif s[i]==')' and stack[-1]=='(':
                    stack.pop()
                elif s[i]==']' and stack[-1]=='[':
                    stack.pop()
                elif s[i]=='}' and stack[-1]=='{':
                    stack.pop()
                else:
                    return False                
           
        if not stack:
            return True
        else:
            return False                

方法二:字典:

py 复制代码
class Solution:
	def isValid(self,s:str)->bool:
		if len(s)%2==1:
			return False
		pairs={
			')':'(',
			']':'[',
			'}':'{'
		}
		stack=list()
		for ch in s:
			if ch in pairs:
				if not stack or stack[-1] !=pairs[ch]:
					return False
				stack.pop()
			else:
				stack.append(ch)
	return not stack

这个代码的的逻辑很明显比我的要好,逻辑非常的清晰,我的逻辑包络了所有的可能性,但是不够合理,他的逻辑是使用字典,配对的理念确实很好。

2.合并两个有序数组

这个题很简单,主要是这里有一个要求

py 复制代码
class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        res=[]
        index1,index2=0,0
        while index1<m and index2<n:
            if nums1[index1]<=nums2[index2]:
                res.append(nums1[index1])  
                index1+=1
            else:
                res.append(nums2[index2])  
                index2+=1  
        res+=nums1[index1:m] if index2==n else nums2[index2:n]
        nums1[:m+n]=res

他说do not return anything, 要求修改nums1。但是他的测试用例其实是在背后直接读原地址的,所以还是要修改原数列。nums1:m+n=res就可以了。

3.三数之和

py 复制代码
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        res=[]
        for first in range(len(nums)-2):
            if first>0 and nums[first]==nums[first-1]:
                continue
            third=len(nums)-1
            second=first+1
            while third>second:
                if second>first+1 and nums[second]==nums[second-1]:
                    second+=1
                    continue
                if third<len(nums)-1 and nums[third]==nums[third+1]:
                    third-=1
                    continue
                ans=nums[first]+nums[second]+nums[third]
                if ans==0:
                    res.append([nums[first],nums[second],nums[third]])
                    third-=1
                elif ans>0:
                    third-=1
                else: #ans<0:
                    second+=1
        return res

技术要点:

1.要对first进行限制,如果遇到同样的数字,那么就跳过

2.third为最后一个数字,second为first之后第一个数字

3.循环条件是second要小于third,对ans进行判断,如果小于,那就second放大,如果大于,那就third调小,如果相等,那就记录并且第三个降一个,也可以third和second同时降,这样的用时反而会更少。

4.括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3

输出:"((()))","(()())","(())()","()(())","()()()"

示例 2:

输入:n = 1

输出:"()"

py 复制代码
from typing import List
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        def dfs(ans,remaining):
            if len(ans)==n*2:
                if check(ans):
                    if ans not in res:
                        res.append(ans)
                        ans=''
                        return
                    else:return
                else: return
            
            for i in range(len(remaining)):
                dfs(ans+remaining[i],remaining[:i]+remaining[i+1:])  
        
        def check(s:str)->bool:
            stack=[]
            for i in range(len(s)):
                if not stack:
                    stack.append(s[0])
                    continue
                if stack[-1]==')':
                    return False
                else:
                    if s[i]==')':
                        stack.pop()
                    if s[i]=='(':
                        stack.append('(')
            return not stack
        
        res=[]
        dfs('','()'*n)
        
        return res

我自己的办法,有太多太多的无用功了,超时

方法二:回溯算法:

py 复制代码
class Solution:
    def generateParenthesis(self,n:int)->List[str]:
        res=[]
        S=''
        def backtrack(S,left,right):
            if len(S)==2*n:
                res.append(''.join(S))
                return
            if left<n:
                S.append('(')
                backtrack(S,left+1,right)
                S.pop()
            if right<left:
                S.append(')')
                backtrack(S,left,right+1)
                S.pop()
        backtrack([],0,0)
        return res    		
相关推荐
不好听61310 分钟前
Python Dict 和 Set 底层原理:从哈希函数到哈希表全方位解析
python
甄心爱学习10 分钟前
【项目实训(个人10)】
开发语言·前端·javascript
散峰而望11 分钟前
【算法练习】算法练习精选:从 Phone numbers 到 Decrease,覆盖字符串、模拟、图论思维题
数据结构·c++·算法·贪心算法·github·动态规划·图论
右耳朵猫AI16 分钟前
Java & JVM技术周刊 2026年第20周
java·开发语言·jvm
好名字更能让你们记住我16 分钟前
【接口自动化测试】博客系统接口自动化测试报告
python·功能测试·自动化·接口测试·接口自动化·测试覆盖率
人道领域17 分钟前
【LeetCode刷题日记】538.把二叉搜索树转换为累加树
java·开发语言·后端·算法·leetcode
铁皮哥18 分钟前
【后端开发】什么是守护线程,和普通线程有什么区别?
java·开发语言·数据库·人工智能·python·spring·intellij-idea
并不喜欢吃鱼21 分钟前
从零开始 C++----- 十二【C++ 数据结构】map/set 全解析:从使用到红黑树底层模拟实现
开发语言·数据结构·c++
枫叶丹423 分钟前
【HarmonyOS 6.0】Live View Kit 实况窗开发详解:进度胶囊支持副文本功能探究
开发语言·华为·harmonyos
不会C语言的男孩23 分钟前
C++ Primer Plus 第17章:输入、输出和文件
开发语言·c++