我在leetcode上解決了這個問題,問題陳述如下。刪除無效圓括號 - Leetcode時間複雜度
刪除無效括號的最小數目以使輸入字符串有效。返回所有可能的結果。
注意:輸入字符串可能包含除括號(和)以外的其他字母。
Examples:
"()())()" -> ["()()()", "(())()"]
"(a)())()" -> ["(a)()()", "(a())()"]
")(" -> [""]
我在一段時間後能夠解決問題。但是我無法找到解決方案的時間複雜性。我的代碼如下。請幫助我找到時間複雜性。
class Solution {
public:
void balance(string s, int curr_index, int changes, int max_changes, unordered_set<string> &memo, vector<string> &result){
if(memo.find(s) != memo.end()){
return;
}
if(changes == max_changes){
int opening = 0;
for(int i = 0; i < s.length(); i++){
if(s[i] == '('){
opening++;
}
else if(s[i] == ')'){
if(opening == 0){
return;
}
else{
opening--;
}
}
}
if(opening == 0){
result.push_back(s);
}
}
else if(changes > max_changes || curr_index >= s.length()){
return;
}
else{
if(s[curr_index] == '(' || s[curr_index] == ')'){
string temp = s;
temp.erase(temp.begin() + curr_index);
balance(temp, curr_index, changes + 1, max_changes, memo, result);
}
balance(s, curr_index + 1, changes, max_changes, memo, result);
}
memo.insert(s);
}
vector<string> removeInvalidParentheses(string s) {
int opening = 0;
int min_changes = 0;
vector<string> result;
for(int i = 0; i < s.length(); i++){
if(s[i] == ')' && opening == 0){
min_changes++;
}
else if(s[i] == ')' && opening != 0){
opening--;
}
else if(s[i] == '('){
opening++;
}
}
min_changes += opening;
if(min_changes == s.length()){
result.push_back("");
return result;
}
else{
unordered_set<string> memo;
balance(s, 0, 0, min_changes, memo, result);
return result;
}
}
};
上述的時間複雜度似乎是'O(n!2^n)'。但實際上,您可以使用BFS解決方案來改進此問題。在這種情況下,時間複雜度會在'O(n!)' – CodeHunter