这道题在网上也有了很多的的解法,我的解题思路主要是利用正则表达式
解题思路:
-
利用正则表达式
regex reg("([\\(]{1})([1]?)([\\)]{1})");
将所有()都化为1
-
创建新的正则表达式
reg = "([\\(]{1})([0-9]*)([\\)]{1})"; regex reg1("([\\(]{1})([1]*)([\\)]{1})"); regex reg2("([\\(]{1})([2]*)([\\)]{1})");
将例如(11111111)或者(22222222)这样的式子计算出来,在程序里,凡是括号内数字之和大于2的统一改变成(num+)这样的形式;
-
利用最后两个正则表达式
regex reg3("[\\(]{1}[\\d]{1,}[\\+]{1}[\\)]{1}"); regex reg4("[\\(]{1}[\\d\\+]{1,}[\\)]{1}");
就可以处理所有的式子并得出最终的答案
附上测试代码:
class Solution {
public:
int ans = 0;
int scoreOfParentheses(string S)
{
bool confine = 1;
string pattern1 = "([\\(]{1})";
string pattern2 = "([1]{1})";
string pattern3 = "([\\)]{1})";
regex reg("([\\(]{1})([1]?)([\\)]{1})");
smatch m, m1;
if (regex_search(S, m, reg))
{
string temp = m.str(2);
string pre = m.prefix();
if (temp.length()==0)
{
S = regex_replace(S, reg, "1");
}
cout << S << endl;
}
disum(S);
cout << S << endl;
reg = "([\\(]{1})([0-9]*)([\\)]{1})";
regex reg1("([\\(]{1})([1]*)([\\)]{1})");
regex reg2("([\\(]{1})([2]*)([\\)]{1})");
while (regex_search(S, m, reg))
{
string temp = m.str();
string pre = m.prefix();
string suf = m.suffix();
string num = m.str(2);
string _te;
auto pos = S.find(temp);
int re = 0, te = 0, len = 0;
if (regex_search(temp,reg1))
{
te = 2 * num.size();
confine = 0;
}
else if (regex_search(temp, reg2))
{
te = 2 * 2 * num.size();
confine = 0;
}
else
{
te = 2 * stoi(num);
confine = 1;
}
if (confine==0)
{
for (int i = pre.length() - 1; i > -1; i--)
{
if (pre[i] > 47)
{
te += pre[i] - 48;
re++;
}
else
break;
}
for (int i = 0; i < suf.length(); i++)
{
if (suf[i] > 47)
{
te += suf[i] - 48;
len++;
}
else
break;
}
if (te>2)
{
_te = to_string(te) + '+';
}
else
{
_te = to_string(te);
}
}
else
{
for (int i = pre.length() - 1; i > -1; i--)
{
if (pre[i] > 47)
{
te += (pre[i] - 48)*(pow(10, re));
re++;
}
else
break;
}
for (int i = 0; i < suf.length(); i++)
{
if (suf[i] > 47)
{
te += suf[i] - 48;
len++;
}
else
break;
}
_te = to_string(te) + '+';
}
S.replace(pos - re, temp.length() + re + len, _te);
cout << S << endl;
}
regex reg3("[\\(]{1}[\\d]{1,}[\\+]{1}[\\)]{1}");
while (regex_search(S,m,reg3))
{
string temp = m.str();
string pre = m.prefix();
string suf = m.suffix();
string num;
for (int i = 0; i < m.str().length(); i++)
{
if (m.str()[i] > 47 && m.str()[i] < 58)
{
num += m.str()[i];
}
}
string _te;
auto pos = S.find(temp);
int re = 0, te = 0, len = 0;
te = 2 * stoi(num);
for (int i = pre.length() - 1; i > -1; i--)
{
if (pre[i] > 47)
{
te += (pre[i] - 48)*(pow(10, re));
re++;
}
else
break;
}
//for (int i = 0; i < suf.length(); i++)
//{
// if (suf[i] > 47)
// {
// te += suf[i] - 48;
// len++;
// }
// else
// break;
//}
_te = to_string(te) + '+';
S.replace(pos - re, temp.length() + re + len , _te);
cout << S << endl;
}
int time = 0;
regex reg4("[\\(]{1}[\\d\\+]{1,}[\\)]{1}");
while(regex_search(S, m, reg4))
{
int t_num = 0;
string temp = m.str();
string pre = m.prefix();
string suf = m.suffix();
for (int i = temp.length()-1; i >-1; i--)
{
if (temp[i] > 47 && temp[i] < 58)
{
t_num += (temp[i] - 48)*(pow(10, time));
time++;
}
else if (temp[i] == '+')
time = 0;
}
string _te;
auto pos = S.find(temp);
int re = 0, te = 0, len = 0;
te = 2 * t_num;
time = 0;
for (int i = pre.length() - 1; i > -1; i--)
{
if (pre[i] > 47)
{
te += (pre[i] - 48)*(pow(10, time));
re++;
time++;
}
else if (pre[i]=='+')
{
time= 0;
re++;
}
else
break;
}
_te = to_string(te) + '+';
S.replace(pos - re, temp.length() + re + len, _te);
cout << S << endl;
time = 0;
}
for (int i = S.length()-1; i >-1; i--)
{
if (S[i] > 47 && S[i] < 58)
{
ans += (S[i] - 48)*(pow(10, time));
time++;
}
else if (S[i] == '+')
time = 0;
}
return ans;
}
int num(string temp)
{
int te = 0;
for (int i = 0; i < temp.length(); i++)
{
te += temp[i] - 48;
}
return te;
}
void disum(string &s)
{
regex reg("[0-9]{2,}");
smatch m;
string ss;
while (regex_search(s, m, reg))
{
string temp = m.str();
auto pos = s.find(temp);
int te = num(temp);
s.replace(pos, temp.length(), to_string(te));
if (to_string(te).size() > 1)
{
auto save = s.find(to_string(te));
ans += te;
//ss += s.substr(0, pos + to_string(te).size());
s.erase(0, pos + to_string(te).size());
}
}
//s = ss + s;
}
};