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    		
相关推荐
李航1983几秒前
DeepSeek AI建模(二)让AI建第一个模型
人工智能·python·计算机视觉·ai·ai编程
Nuanyt3 分钟前
LeetCode Hot 100 · 双指针 3 题 Java
java·笔记·算法·leetcode·双指针
Wang's Blog9 分钟前
Java 项目实战: 交友项目 - 圈子互动
java·开发语言·交友
jimy130 分钟前
构造函数表达式的值类别是:prvalue
开发语言·c++
小嘉丶学长31 分钟前
Day06 · 数据类型与类型检测
开发语言·python·学习·1024程序员节
多弗朗皮卡丘37 分钟前
C++特殊类设计
开发语言·c++·设计模式
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 查询单条动态:动态详情页的接口与实现
java·开发语言·交友
yuniko-n1 小时前
【JUC】CAS
java·开发语言
紧跟先前的步伐1 小时前
Go AI Agent 实战 17|模型适配层设计:让模型可替换
开发语言·人工智能·后端·ai·golang
志起计算机编程1 小时前
Clickhouse的几个关键优势
算法