题解 | #最长公共子括号序列#

最长公共子括号序列

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

//这个题目一开始想插了,想去先求题目给的那个字符串用递归求出所有的合法的匹配字符,再把每个匹配字符用动态规划去求最长子字符串得出结果。
//加上看了第一个大哥也是这么想的,一条路走到黑,后来发现时间不符号要求,有一半例子超时,再看一看他的复杂度(基本算是2的n次幂)括号多一点就吃不消了
//然后自己想想能不能从别的地方入手,就发现我可以先处理最长子字符串(用动态规划那个)
//通过观察发现,因为不能和原字符串相同,所以最长子字符串基本就是原字符串的长度n减去1,(这里我没细想,基本没跑,也可能跑)
//那既然最长确定是n-1,那我原字符串删去一个字符号就肯定可以和对应字符串删去一个字符相等,所以符合最长子字符串的对应字符串 一定是原字符串拿掉一个字符a,然后在这个字符串任意地方插入这个字符a(换一个字符相当于直接不符合括号合法性了)
//通过循环(n的平方复杂度)得出了所有符合最长子字符串为n-1的结果,然后拿这些结果去判断一下他的括号合法性(这里要用到栈),不相同再用Map字典筛选一下,就得出了最后的结果
//复杂度从2的n次降到了n的平方,我的感想是遇到这种可能同时用到递归和动态规划的题,想想有没有可能是陷阱,一般题目不会猛堆工作量。一定要试一试多分析分析题目看看有没有别的路(感觉我也是狗屎想出来的,平常我肯定一条道走到黑了,所以总结一下)
package main

import (
	"bufio"
	"fmt"
	"os"
)

var M map[string]bool
var lendata1 int
//普通的栈
type Stake1 struct{
	index int
	list []int
	capp int

}
func (thisS *Stake1)newstake(c int){
	thisS.capp = c
	thisS.list = make([]int,thisS.capp)
	thisS.index = -1
}
func (thisS *Stake1)push(num int){
	thisS.index = thisS.index + 1
	thisS.list[thisS.index] = num
}
func (thisS *Stake1)pop()(a int){
	a = thisS.list[thisS.index]
	thisS.index--
	return
}
//判断是否合法
func hefa(s string)bool  {
	st := Stake1{}
	st.newstake(lendata1)
	for i:=range s{
		if s[i]==40{
			st.push(40)
		}else {
			if st.index==-1{
				return false
			}
			st.pop()
		}
	}
	return true

}
func main(){
	in:=bufio.NewScanner(os.Stdin)
	in.Scan()
	data1:=in.Text()
	M=make(map[string]bool)
	lendata1 =len(data1)
	M[data1] = true
	str :=""
	max:=0
        //找到两个字符串(一个是题目给的字符串)都删减一次就能相同的对应字符串(满足n-1的公共子括号)
	for i,_:=range data1{
		kuohao := string(data1[i])
		str = data1[:i]+data1[i+1:]
		str1:=""
		for j:=0;j<lendata1;j++{
			if j!=lendata1-1{
				str1 = str[:j]+ kuohao+str[j:]
			}else {
				str1 = str[:j]+ kuohao
			}
			ok,_ := M[str1]
			if !ok{
				if hefa(str1){
					max= max+1
					M[str1] = true
				}
			}
		}
	}
	fmt.Println(max)

}    

全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务