合法的括号序列 | 记忆化搜索 Go

合法的括号序列

https://www.nowcoder.com/practice/cd3c583ac7054a18b164fbd4ec3247c4

题意

给定一个仅包含'('、')'和'?'三种字符构成的字符串,'?'字符可以代替左括号或者右括号。请问该字符串可以代表多少种不同的合法括号序列?

思路

看基本上都写的dp,来个记忆化搜索的代码吧

每个?字符都有两种可能,填左括号或是填右括号,可以枚举填哪个进行记忆化搜索

如何判断是合法的括号序列?只需要维护左括号比右括号多了几个就可以,也就是当前没有配对的右括号个数。假设为val,如果当前是左括号,那么下一次dfs的参数肯定是val+1;如果当前是右括号,下一次dfs参数是val-1,表示可以配对一个左括号。注意这里其实会有不合法情况,就是其实左边是没有左括号的,也就是val为负数的情况,需要在dfs开始就判断下。

边界条件就是如果遍历完了所有的字符串,如果左括号和右括号一样多,就是合法的,返回1;否则,返回0

这里是从1到n写的记忆化搜索,也可以从n到1,一样的思路

注意取模

package main

import "fmt"

func main() {
	/*
		给定一个仅包含'('、')'和'?'三种字符构成的字符串,'?'字符可以代替左括号或者右括号。请问该字符串可以代表多少种不同的合法括号序列?
	*/
	const MOD = 1_000_000_007
	var s string
	fmt.Scan(&s)
	n := len(s)
	s = " " + s
	var dfs func(int, int) int

	/*
		子问题:如果当前字符是?的话填什么 可以填左括号 也可以填右括号
		两种选择
		val表示没有配对的左括号数量
	*/
	dp := make([][]int, n+1)
	for i := 1; i <= n; i ++ {
		dp[i] = make([]int,n+1)
		for j := 0; j <= n; j ++{
			dp[i][j] = -1 
		}
	}
	
	dfs = func(idx int, val int) int {
		if val < 0 {
			return 0
		}
		if idx == n+1 {
			//结束
			if val == 0 {
				return 1
			} else {
				return 0
			}
		}
		if dp[idx][val] != -1 {
			return dp[idx][val]
		}
		var res = 0
		if s[idx] == '?' {
			//这一位填(
			res = (res + dfs(idx+1, val+1)) % MOD
			//这一位填) 
			res = (res + dfs(idx + 1, val - 1 )) % MOD
		}else if s[idx] == '(' {
			res = dfs(idx+1,val+1) 
		}else{
			res = dfs(idx+1,val-1) 
		}
		dp[idx][val] = res
		return res
	}
	fmt.Println(dfs(1,0))
}

#牛客创作赏金赛#
15天大厂真题带刷Go题解 文章被收录于专栏

15天大厂真题带刷Golang题解

全部评论

相关推荐

宇算唯航:目测实缴资本不超100W的小公司
点赞 评论 收藏
分享
不亏是提前批,神仙打架,鼠鼠不配了
站队站对牛:现在92都报工艺岗了
投递韶音科技等公司7个岗位
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务