856. 括號的分數
阿新 • • 發佈:2018-12-03
這道題在網上也有了很多的的解法,我的解題思路主要是利用正則表示式
解題思路:
-
利用正則表示式
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; } };