我在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),并且有O(2^n)个叶子,如上所述。所以O(n*2^n)是正确的时间复杂度。
本文向大家介绍删除C ++中的无效括号,包括了删除C ++中的无效括号的使用技巧和注意事项,需要的朋友参考一下 假设我们有一串括号。我们必须删除最少数量的无效括号并返回格式正确的括号字符串,因此,如果输入类似于“()(()()”,那么结果将是[“()()()”,“( )(())”] 为了解决这个问题,我们将遵循以下步骤- 定义一个名为solve()的方法,它将接受pos、left、right、l、
输入: 简单地说,复杂度是不是3*(len(ab)+4*(len(c)),我说的对吗?
我试图理解什么是leetcode 241的时间复杂性。添加括号的不同方式。我用了回忆录技术。我的朋友被问到在谷歌编码轮,他不能给出正确的时间和空间复杂度。我在Leetcode中也发现了同样的问题。 问题:给定一串数字和运算符,返回所有可能的结果,从计算所有不同的可能方法,以分组数字和运算符。有效运算符是+、-和*。 例1: ((2-1)-1)=0 (2-(1-1))=2 例2: 说明: (2*(3
问题内容: 我只是想知道如何在php中删除一组括号和括号本身之间的文本。 范例: ABC(测试1) 我想删除(Test1),只离开ABC 谢谢 问题答案: 是基于Perl的正则表达式替换例程。该脚本的作用是匹配所有出现的右括号,后跟任意数量的字符 而不是 右括号,然后再次跟右括号,然后删除它们: 正则表达式细目:
假设BST的高度是h。如果我们要删除一个有两个子节点的节点,那么该过程的时间复杂度是多少。 我知道在普通的二叉树中,删除的时间复杂度是O(h);O(n)最坏情况和O(logn)最好情况。但是由于我们用它的右子树的最小节点替换删除节点的键,因此需要更多时间来找到最小键。 那么,有人知道如何解释这种情况下的时间复杂性吗?
给定一个整数数组arr,计算元素x,使得x 1也在arr中。如果arr中有重复项,请分别计数。 示例1:输入:arr=[1,2,3]输出:2说明:1和2被计数,因为2和3在arr中。 示例2:输入:arr=[1,1,2]输出:2解释:1计数两次,原因2在arr中。 示例3:输入:arr=[1,1,3,3,5,5,7,7]输出:0说明:没有计算数字,因为arr中没有2、4、6或8。 示例4:输入:a