前言
本来没看懂题解的时候,我真的是欲哭无泪,一再感叹数据结构真难,但是会了之后发现,这也太简单了吧,而我也太聪明了吧!!!
题目描述
给出一个字符串 s(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中不应 包含任何括号。
题目解析
像这种遇见括号的不用想 首先考虑用栈
而且在写的时候一般都是要分三种情况讨论的(下面就本题来说)
(1)遍历到左括号时:遇见左括号的时候,不用反转字母,所以只需要将当前已经遍历到的字符压进栈,等待右括号就行,同时将临时字符串res置为NULL
(2)遍历到右括号时:遇见右括号,就需要进行反转操作了,这道题就是将当前res反转,然后再栈顶元素加上其这个反转过后的字符。
原理就是遇见左括号时进行的是左括号之前的字符入栈,那么当遇到右括号时,右括号先与当前的res配对,这就完成了一对括号间字符串的反转
用栈顶元素加这个反转之后的结果说白了就是将栈顶元素出栈然后等待下一个右括号与之匹配,如果没有,那理所应当的栈顶元素先入栈,说明其在前。如果有,再反转就行了
(3)遍历到字母(非括号)时:遇见字母,就直接保存在临时字符串变量res中,等待遇见左括号时压入栈
完整代码
#include<iostream>
#include<cstring>
#include<stack>
#include <algorithm>
using namespace std;
//题目解析
//像这种遇见括号的不用想 首先考虑用栈
//而且在写的时候一般都是要分三种情况讨论的(下面就本题来说)
//(1)遍历到左括号时:遇见左括号的时候,不用反转字母,所以只需要将当前已经遍历到的字符压进栈,等待右括号就行,同时将临时字符串res置为NULL
//(2)遍历到右括号时:遇见右括号,就需要进行反转操作了,这道题就是将当前res反转,然后再栈顶元素加上其这个反转过后的字符。
// 原理就是遇见左括号时进行的是左括号之前的字符入栈,那么当遇到右括号时,右括号先与当前的res配对,这就完成了一对括号间字符串的反转
// 用栈顶元素加这个反转之后的结果说白了就是将栈顶元素出栈然后等待下一个右括号与之匹配,如果没有,那理所应当的栈顶元素先入栈,说明其在前。如果有,再反转就行了
//(3)遍历到字母(非括号)时:遇见字母,就直接保存在临时字符串变量res中,等待遇见左括号时压入栈
class Solution{
public:
string reverseParentheses(string s){
stack<string> s1;
string res="";
for(int i=0;i<s.length();i++){
if(s[i]==')'){
reverse(res.begin(),res.end());
res=s1.top()+res;
s1.pop();
}
else if(s[i]=='('){//如果现在是左括号
s1.push(res);
res="";
}else{//如果现在是字母
res+=s[i];
}
}
return res;
}
};
int main(){
string s;
cin>>s;
s=Solution().reverseParentheses(s);
cout<<s<<endl;
return 0;
}
写在后面的话
是从7号开始刷题的吧,因为研一开学就要期末考试,就考这些东西,本科的时候确实没怎么接触过算法类的竞赛或者什么,一般就是神经网络用python用的比较多,但是计算机视觉方面,怎么说呢,重在人工吧,自己去搭建一个神经网络吧,不太可能,知识储备不够,利用别人的模型去训练自己的数据,说实话确实是很low的,很快就可以入门。这两天刷题也是时常会自闭,但幸运的是,我有很多谦虚耐心的同学帮助我,今天心血来潮写这段话也是想让自己记住以后不管遇到多困难的题,不要轻易的放弃,去找解决方法,早晚都会解决的,早找解决方法就早解决。
昨天写这道题的时候,我问了沅沅,沅沅给我讲了思路,但是我着手写代码的时候还是不会,心里就很烦,上午看了一上午视频,把这道题就搁置了,下午午睡到四点,志愿者开会又到了吃过晚饭,但总要解决,我再一次求助了沅沅还有梦龙,沅沅每次都会很耐心的先安抚我急躁的心情然后再给我讲她是怎么做的,再次感谢我的同学,梦龙也是并没有含糊我的问题,还和我讨论,让我觉得以后有问题了还可以一起交流,这是我觉得很幸运的事情。
总结一下,就是想说以后遇见任何困难,首先尝试自己解决,借助现在发达的网络资源,借助网友的智慧去帮助自己,如果还是解决不了,就去找你周围比你强的人,这样解决的更快。