1190. 反转每对括号间的子串
我的思路
使用 栈 , 从前向后遍历,如果遇到 )
就将栈中字符取出直到栈空或者遇到 (
,如果遇到非 )
,那么将其压栈。
AC代码如下:
class Solution {
public:
string reverseParentheses(string s) {
stack<char> sta;
for (auto item : s){
if (item == ')'){
string rev = "";
while (!sta.empty() && sta.top() != '('){
rev += sta.top();
sta.pop();
}
if (!sta.empty()){
sta.pop();
}
for (auto ch : rev){
sta.push(ch);
}
}else{
sta.push(item);
}
}
string ret = "";
while (!sta.empty()){
ret += sta.top();
sta.pop();
}
reverse(ret.begin(), ret.end());
return ret;
}
};
复杂度分析:
- 时间复杂度:
O
(
n
2
)
O(n^2)
O(n2),两层
for
。 - 空间复杂度: O ( n ) O(n) O(n),使用了栈。
时间复杂度优化
我们可以 预处理 字符串
s
s
s , 对于
s
s
s 中每一对对应的 (
和 )
,求出他们的位置。
然后,从前往后遍历
s
s
s , 如果遇到 (
或者 )
就 调转方向, 遇到其他字符加入返回结果中。
AC代码如下:
class Solution {
public:
string reverseParentheses(string s) {
int n = s.size();
vector<int> Pair(n);
stack<int> sta;
for (int i = 0; i < n; i ++){
if (s[i] == '('){
sta.push(i);
}else if (s[i] == ')'){
int j = sta.top();
Pair[i] = j, Pair[j] = i;
sta.pop();
}
}
string ret = "";
int step = 1, index = 0;
while (index < n){
if (s[index] == '(' || s[index] == ')'){
index = Pair[index];
step = -step;
}else{
ret.push_back(s[index]);
}
index += step;
}
return ret;
}
};
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n),需要两次遍历字符串,因此,复杂度是 O ( n ) O(n) O(n).
- 空间复杂度:
O
(
n
)
O(n)
O(n),使用了栈和
Pair
数组。
2021/5/26 20:37
今天,在科工楼领到了设备,设备的性能不错:
Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz 2.90 GHz
32.0 GB (31.7 GB 可用)
Windows 10 专业版
Dell全家桶:主机+显示器。
32G内存,舒服了,开虚拟机终于不会卡了!