文章目录
32. 最长有效括号
题目
假如只有前半部分代码,"(()" 这个样例都过不了。
class Solution {
public:
int longestValidParentheses(string s) {
int l=0,r=0,ans=0;
for(char c:s){
if(c=='(') ++l;
else ++r;
if(l==r) ans=max(ans,2*l);
if(l<r) l=r=0;
}
l=0,r=0;
reverse(s.begin(),s.end());
for(char c:s){
if(c==')') ++l;
else ++r;
if(l==r) ans=max(ans,2*l);
if(l<r) l=r=0;
}
return ans;
}
};
class Solution {
public:
//dp[i]: 以i为结尾的最长有效括号
int longestValidParentheses(string s) {
int n=s.size();
int *dp=new int[n];
if(n==0||n==1) return 0;
dp[0]=0,dp[1]=(s[0]=='('&&s[1]==')')?2:0;
for(int i=2;i<n;++i){
if(s[i]=='(') dp[i]=0;
else{
if(s[i-1]=='(') dp[i]=dp[i-2]+2;//(()())()
else{
int k=i-dp[i-1]-1;
if(k>=0&&s[k]=='(') dp[i]=dp[i-1]+2+((k>=1)?dp[k-1]:0);//()(((((())))))
else dp[i]=0;//)())
}
}
}
int ans=0;
for(int i=0;i<n;++i) ans=max(ans,dp[i]);
return ans;
}
};
856. 括号的分数
题目
第一种方法:比如((())()(*)) 只算最里面的括号对答案的权值是1<<l,l是向外的深度.
class Solution {
public:
//比如(((*))(*)(*)) 只算最里面的括号对答案的权值是1<<l,l是向外的深度.
int scoreOfParentheses(string s) {
int l=0,ans=0;
for(int i=0;i<s.size();++i){
if(s[i]=='(') ++l;
else{
--l;
if(s[i-1]=='(') ans+=(1<<l);
}
}
return ans;
}
};
第二种方法:我不太会描述
这题就是 比如((() 栈里面就是0,0,1
每个元素的意思是 这个左括号暂时向右能得到的分数 比如(()() 栈里面就是0,2 因为第2个(向右可以直到(()().
栈里每个元素都是(的意思。(()再来一个)时,栈顶就代表((),栈顶*2就是(()),加上栈顶里面的一个 那是同一级别的.
class Solution {
public:
int scoreOfParentheses(string s) {
stack<int>st;
st.push(0);
for(char c:s){
if(c=='(') st.push(0);
else{
int y=st.top();st.pop();
int x=st.top();st.pop();
st.push(x+max(y<<1,1));
}
}
return st.top();
}
};