856. Score of Parentheses
题目大意:一个仅有 ( ) 两种符号的字符串 一个 ()代表 1 , ( (A) ) 表示 2*A , (A) (B) 表示 A+B,求一个字符串表示的内容
解题思路:这么思考 对于 一个 ( ) 包括的字符串 如果是 ( (....) ) 这样的形式 那么 结果等于 2* (....) 这个的结果,就等价于求一个子问题,所以考虑实用一个递归。
class Solution {
public:
int i;
int dfs(string S,int left)
{
//cout<<"i : "<<i<<endl;
int len =S.size();
int res=0;
for(;i<len;i++)
{
//cout<<"i:"<<i<<" "<<S[i]<<" "<<S[i+1]<<" "<<left<<endl;
if(S[i]=='(' && S[i+1]=='(')
{
i+=1;
int temp = dfs(S,1);
//cout<<temp<<" "<<left<<" "<<i<<endl;
res = res + 2* temp;
continue;
}
else if(S[i]=='(' && S[i+1]==')' )
{
res+=1;
}
if(S[i]=='(') left++;
if(S[i]==')') left--;
if(left==0) return res;
}
}
int scoreOfParentheses(string S) {
int res =0;
for(i=0;i<S.size();i++)
{
if(S[i]=='(' && S[i+1]==')')
res+=1;
else if(S[i]=='(' && S[i+1]=='(')
{
i+=1;
int temp = dfs(S,1);
//cout<<temp<<endl;
res =res + 2* temp;
}
}
return res;
}
};
但是,还可以换个角度来思考,因为只要是由 ( ) 包括 里面的内容都会 *2 所以可以对每一个内容进行考虑
class Solution {
public int scoreOfParentheses(String S) {
int ans = 0, bal = 0;
for (int i = 0; i < S.length(); ++i) {
if (S.charAt(i) == '(') {
bal++;
} else {
bal--;
if (S.charAt(i-1) == '(')
ans += 1 << bal;
}
}
return ans;
}
}