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    		
相关推荐
2401_8582861117 分钟前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py19 分钟前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy19 分钟前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
AIAdvocate1 小时前
Pandas_数据结构详解
数据结构·python·pandas
小言从不摸鱼1 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
jiao000012 小时前
数据结构——队列
c语言·数据结构·算法
C-SDN花园GGbond2 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处3 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ3 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
FreakStudio3 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy