对于典型递归类问题求解的思考

一.算法题干

给出一个字符串s(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中不应包含任何括号。

二.解题思路

该题是典型的需要用到递归算法的题目。该题的主要思路是:将整个原始字符串看作三段,第一段是字符串开头到第一个左括号之间的部分,第二段是第一左括号和最后一个右括号中间的部分,第三段是最后一个右括号到字符串最后的部分。其中对第二段字符串进行求解和对原始字符串进行求解是相同类型、但问题规模更小的问题,这正符合递归的定义。而递归在本问题中的终止条件是字符串中不存在括号、返回原字符串。

三.实现代码

class Solution {
public:
    string reverseParentheses(string s) {
        int pos=s.find("(");
        if(pos==string::npos) return s;
        int lv=0;
        for(int i=pos;i<s.length();++i)
        {
            if(s[i]=='(') ++lv;
            else if(s[i]==')') --lv;
            if(!lv)
            {
                string ans=s.substr(0,pos);
                string str=reverseParentheses(s.substr(pos+1,i-(pos+1)));
                reverse(str.begin(),str.end());
                ans+=str;
                ans+=reverseParentheses(s.substr(i+1));
                return ans;
            }
        }
        return "";
    }
};

四.对比分析

class Solution:
    def reverseParentheses(self, s: str) -> str:
        ans=""
        st=ed=cnt=0
        while st<len(s):
            if s[ed]=='(':
                cnt+=1
            elif s[ed]==')':
                cnt-=1
            if cnt==0:
                if st==ed:
                    ans+=s[ed]
                    st+=1
                else:
                    ans+=self.reverseParentheses(s[st+1:ed])[::-1]
                    st=ed+1
            ed+=1
        return ans

首先,这段代码是用Python实现的。和使用C++实现不同的是,Python在字符串的操作上表述更为容易理解。该代码的实现思路关键点在于设置了“开始”和“结束”两个指针,让“结束”指针扫描整个字符串来寻找括号,并计算括号的层数,如果当前没有括号就直接将字符原样进行拼接,如果有括号则将括号内的字符串再次输入到递归函数中进行求解,并进行翻转。双指针法在字符串操作相关算法中经常被使用到,还是需要好好体会其精髓。

五.题目来源

反转每对括号间的子串

发布了22 篇原创文章 · 获赞 0 · 访问量 1293

猜你喜欢

转载自blog.csdn.net/qq_35238352/article/details/101207952