Best Method I have seen so far. Scan the target string from left to right, and then from right to left. Use a counter to remember the valid parentheses.
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
string getValidString(const string s) {
if(s.size() == 0) return s;
int left = 0, right = 0;
string tmp, result;
for(auto c : s) {
if(c == '(') {
left++;
tmp += '(';
} else if(c == ')') {
if(left > 0) {
left--;
tmp += ')';
}
} else {
tmp += c;
}
}
for(int i = tmp.size() - 1; i >= 0; --i) {
if(tmp[i] == ')') {
right++;
result += ')';
} else if(tmp[i] == '(') {
if(right > 0) {
right--;
result += '(';
}
} else {
result += tmp[i];
}
}
reverse(result.begin(), result.end());
return result;
}
int main(void) {
string res = getValidString("((a)");
cout << res << endl;