zoukankan      html  css  js  c++  java
  • [20191006机房测试] 括号序列

    可怜不喜欢括号序列,但是她发现总是有人喜欢出括号序列的题
    为了让全世界都能感受到她的痛苦,她想要写-个转换器
    它能把普通的小写字符串转换成长度相同的合法的括号序列
    在可怜的构思中,这样的转换器需要满足如下两个条件:
    1. 结果的括号序列必须要是合法的,即左右括号必须要是相匹配的。
    2. 对于一堆相匹配的左右括号,他们所在的位置原来的小写字母必须相同。
    举例来说,对于字符串aabaab,()(()) 就是一个合法的答案,而()()()不满足第二个条件,((())不满足第一个条件
    可怜发现对于一个小写字符串,有时候有很多满足条件的括号序列,有些时候一个都没有
    于是可怜给出了一个小写字符串,她想让你帮她算一下,有多少不同的子串可以转化为满足条件的括号序列
    

    这题的思路有点神仙啊……
    暴力方法是对于每个字母维护一个栈
    每次向后枚举,遇到不同的字母就入栈,如果字母和前一个相同,双双弹出(双双:?)
    但这样的时间复杂度是 (Theta{(n^2)}) 的,所以我们想想优化

    其实我们只需要开一个栈,每到一个位置操作完以后,把当前栈的情况用hash记录一下
    如果有多个位置的hash值相同,就说明这几个位置之间的字母被弹出了
    说明以这几个位置为端点,其中间的区间一定是合法,且连续的
    然后我们把所有hash值排一下序,看每个连续的一段
    如果一段的长度为len,它对答案的贡献就是(dfrac{len*(len-1)}{2})

    然后就结束了

  • 相关阅读:
    C++中几种字符串表示方法
    oracle11g卸载(win10)
    Dbvisualizer 连接oracle数据库
    严重: Exception starting filter struts2 Unable to load configuration.
    eclipse启动Tomcat服务输入http://localhost:8080/报404
    Tomcat内存溢出解决办法
    A Java Runtime Environment(JRE) or Java Development Kit (JDK) must be available in order to run Eclipse.
    Spring容器装配bean的方式
    Spring容器的基本实现
    spring环境搭建
  • 原文地址:https://www.cnblogs.com/tqr06/p/11627329.html
Copyright © 2011-2022 走看看