How to Reverse Substrings Between Each Pair of Parentheses using

  • 时间:2020-09-18 17:39:21
  • 分类:网络文摘
  • 阅读:111 次

You are given a string s that consists of lower case English letters and brackets. Reverse the strings in each pair of matching parentheses, starting from the innermost one. Your result should not contain any brackets.

Example 1:
Input: s = “(abcd)”
Output: “dcba”

Example 2:
Input: s = “(u(love)i)”
Output: “iloveu”
Explanation: The substring “love” is reversed first, then the whole string is reversed.

Example 3:
Input: s = “(ed(et(oc))el)”
Output: “leetcode”
Explanation: First, we reverse the substring “oc”, then “etco”, and finally, the whole string.

Example 4:
Input: s = “a(bcdefghijkl(mno)p)q”
Output: “apmnolkjihgfedcbq”

Constraints:
0 <= s.length <= 2000
s only contains lower case English characters and parentheses.
It’s guaranteed that all parentheses are balanced.

Hints:
Find all brackets in the string.
Does the order of the reverse matter?
The order does not matter.

Using Stack to Keep Tracking the Level of Parentheses

We can use a stack to keep tracking the Parentheses. Also, we can use a variable to record the current string in the current level. If we meet open bracket, we push the current string to the stack, reseting it to “”. And we meet an close bracket, we need to reverse the current string, and add it to the top element of the stack.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
    string reverseParentheses(string s) {
        stack<string> st;
        string cur = "";
        for (int i = 0; i < s.size(); ++ i) {            
            if (s[i] == '(') {
                st.push(cur);
                cur = "";
            } else if (s[i] == ')') {
                std::reverse(begin(cur), end(cur));
                string s = st.top();
                st.pop();
                cur = s + cur;
            } else {
                cur += s[i];
            }
        }
        return cur;
    }
};
class Solution {
public:
    string reverseParentheses(string s) {
        stack<string> st;
        string cur = "";
        for (int i = 0; i < s.size(); ++ i) {            
            if (s[i] == '(') {
                st.push(cur);
                cur = "";
            } else if (s[i] == ')') {
                std::reverse(begin(cur), end(cur));
                string s = st.top();
                st.pop();
                cur = s + cur;
            } else {
                cur += s[i];
            }
        }
        return cur;
    }
};

The complexity is O(N) and the space complexity is also O(N). The stack implements a First In Last Out, and hence is often used in the Parentheses problems.

The std::reverse() is perfect to reverse a string, substring, or a vector.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
危害食品安全的犯罪手段更趋隐蔽  对危害食品安全犯罪案件从严量刑  媒体评论:食品安全乱象,谁之过?  健康饮食:妙用瓜果防治夏季疾病  农夫山泉危机曝出饮用水行业乱象  消费者严重不信任国产奶粉的原因  国人消费崇洋媚外导致洋奶粉的傲慢  暴利诱惑导致贴牌洋奶粉占八成市场  食药监部门曝光12个保健食品违法广告  薏米红豆汤 
评论列表
添加评论