前端刷题路-Day50:反转每对括号间的子串(题号1190)

306 阅读2分钟

这是我参与更文挑战的第14天,活动详情查看: 更文挑战

反转每对括号间的子串(题号1190)

题目

给出一个字符串 s(仅含有小写英文字母和括号)。

请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。

注意,您的结果中 不应 包含任何括号。

示例 1:

输入:s = "(abcd)"
输出:"dcba"

示例 2:

输入:s = "(u(love)i)"
输出:"iloveu"

示例 3:

输入:s = "(ed(et(oc))el)"
输出:"leetcode"

示例 4:

输入:s = "a(bcdefghijkl(mno)p)q"
输出:"apmnolkjihgfedcbq"

提示:

  • 0 <= s.length <= 2000
  • s 中只有小写英文字母和括号
  • 我们确保所有括号都是成对出现的

链接

leetcode-cn.com/problems/re…

解释

这题啊,这题应该可以重拳出击。

但笔者并没有成功重拳出击,哈哈哈。

理解题目时笔者就花了一些时间,主要是这个反转笔者没有理解好,现在想想应该是当时脑回路没有转过来导致的问题。

题目很简单,就是反转字符串,但是要注意反转的次数。

比方说这样的一个🌰:

"(ab(cd(ef(gh))))"

它的反转步骤是:

  • gh -> hg
  • efhg -> ghfe
  • cdghfe -> efhgdc
  • abefhgdc -> cdghfeba

也就是先将已有的数组和括号两的字符串放在一起后再进行反转,题目想表达的就是这个意思。

那么要解决这个办法,笔者首先想到的是取出所有成对的字符串,然后进行组合。但很快就发现这是不可行的,因为可能会出现这种情况的🌰:

"ta()usw((((a))))"

这种在同一层级的用例就无法解决了,GG。

想了半天也没有什么好的想法,最后一看答案,其实很简单,用栈就好了,代码很简单,就看你能不能想得到了。

自己的答案

更好的方法(栈)

用栈解决这个问题就很简单了,首先我们一点点遍历整个字符串,将所有左括号的字符串都拿到,放到一个数组中。

之后如果发现右括号,就将右括号后面的字符串添加到一个字符串中,再取数组中的最后一个元素,放在字符串前面,这就完事了。

循环到最后就能拿到最后的结果,说起来可能比较飘渺,看看代码吧,一看就懂👇:

var reverseParentheses = function(s) {
  var stack = []
      str = ''
  for (const ch of s) {
    if (ch === '(') {
      stack.push(str)
      str = ''
    } else if (ch === ')') {
      str = str.split('').reverse().join('')
      str = stack.pop() + str
    } else {
      str += ch
    }
  }
  return str
}

真的很简单,这里不多赘述。

更好的方法(预处理括号)

这方法虽然时间复杂度更低,但感觉普通人应该是想不出来了,笔者这里也不浪费时间了,直接贴一下官方的地址,感兴趣的同学可以看看,想笔者这种普通人就不指染这种强者的方法了。



PS:想查看往期文章和题目可以点击下面的链接:

这里是按照日期分类的👇

前端刷题路-目录(日期分类)

经过有些朋友的提醒,感觉也应该按照题型分类
这里是按照题型分类的👇

前端刷题路-目录(题型分类)

有兴趣的也可以看看我的个人主页👇

Here is RZ