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