当前位置: 首页 > 知识库问答 >
问题:

删除无效括号-Leetcode时间复杂度

松思源
2023-03-14

我在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;
        }

    }
    };

共有1个答案

岳意蕴
2023-03-14

我知道这是一个有点老的问题,但我只想指出,在我所知道的每个实现中,字符串构建都是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