这是我参与更文挑战的第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
中只有小写英文字母和括号- 我们确保所有括号都是成对出现的
链接
解释
这题啊,这题应该可以重拳出击。
但笔者并没有成功重拳出击,哈哈哈。
理解题目时笔者就花了一些时间,主要是这个反转笔者没有理解好,现在想想应该是当时脑回路没有转过来导致的问题。
题目很简单,就是反转字符串,但是要注意反转的次数。
比方说这样的一个🌰:
"(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:想查看往期文章和题目可以点击下面的链接:
这里是按照日期分类的👇
经过有些朋友的提醒,感觉也应该按照题型分类
这里是按照题型分类的👇
有兴趣的也可以看看我的个人主页👇