📜  找到字典序的下一个平衡括号序列

📅  最后修改于: 2021-10-27 06:27:00             🧑  作者: Mango

给定一个平衡括号序列作为包含字符‘(‘‘)’的字符串str ,任务是找到下一个字典顺序平衡序列,如果可能,否则打印-1
例子:

方法:首先找到最右边的左括号,我们可以用右括号替换它,得到字典序更大的括号字符串。更新后的字符串可能不平衡,我们可以用字典上最小的部分填充字符串的剩余部分:即首先使用尽可能多的左括号,然后用右括号填充剩余位置。换句话说,我们尽量保持尽可能长的前缀不变,后缀被字典序最小的替换。
为了找到这个位置,我们可以从右到左遍历字符,并保持左括号和右括号的平衡深度。当我们遇到左括号时,我们会减少深度,当我们遇到右括号时,我们会增加深度。如果我们在某个时刻遇到左括号,并且处理此符号后的余额为正,那么我们已经找到了可以更改的最右边位置。我们更改符号,计算必须添加到右侧的左括号和右括号的数量,并以字典序最小的方式排列它们。
如果我们找不到合适的位置,那么这个序列已经是最大可能的一个,没有答案。
下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function to find the lexicographically
// next balanced bracket
// expression if possible
string next_balanced_sequence(string& s)
{
    string next = "-1";
    int length = s.size();
    int depth = 0;
    for (int i = length - 1; i >= 0; --i) {
 
        // Decrement the depth for
        // every opening bracket
        if (s[i] == '(')
            depth--;
 
        // Increment for the
        // closing brackets
        else
            depth++;
 
        // Last opening bracket
        if (s[i] == '(' && depth > 0) {
            depth--;
            int open = (length - i - 1 - depth) / 2;
            int close = length - i - 1 - open;
 
            // Generate the required string
            next = s.substr(0, i) + ')'
                   + string(open, '(')
                   + string(close, ')');
            break;
        }
    }
    return next;
}
 
// Driver code
int main()
{
    string s = "((()))";
 
    cout << next_balanced_sequence(s);
 
    return 0;
}


Java
// Java implementation of the approach
class Sol
{
     
// makes a string containing char d
// c number of times
static String string(int c, char d)
{
    String s = "";
    for(int i = 0; i < c; i++)
    s += d;
     
    return s;
}
     
// Function to find the lexicographically
// next balanced bracket
// expression if possible
static String next_balanced_sequence(String s)
{
    String next = "-1";
    int length = s.length();
    int depth = 0;
    for (int i = length - 1; i >= 0; --i)
    {
 
        // Decrement the depth for
        // every opening bracket
        if (s.charAt(i) == '(')
            depth--;
 
        // Increment for the
        // closing brackets
        else
            depth++;
 
        // Last opening bracket
        if (s.charAt(i) == '(' && depth > 0)
        {
            depth--;
            int open = (length - i - 1 - depth) / 2;
            int close = length - i - 1 - open;
 
            // Generate the required String
            next = s.substring(0, i) + ')'
                + string(open, '(')
                + string(close, ')');
            break;
        }
    }
    return next;
}
 
// Driver code
public static void main(String args[])
{
    String s = "((()))";
 
    System.out.println(next_balanced_sequence(s));
}
}
 
// This code is contributed by Arnab Kundu


Python3
# Python3 implementation of the approach
 
# Function to find the lexicographically
# next balanced bracket
# expression if possible
def next_balanced_sequence(s) :
 
    next = "-1";
    length = len(s);
    depth = 0;
     
    for i in range(length - 1, -1, -1) :
         
        # Decrement the depth for
        # every opening bracket
        if (s[i] == '(') :
            depth -= 1;
 
        # Increment for the
        # closing brackets
        else :
            depth += 1;
 
        # Last opening bracket
        if (s[i] == '(' and depth > 0) :
             
            depth -= 1;
            open = (length - i - 1 - depth) // 2;
            close = length - i - 1 - open;
 
            # Generate the required string
            next = s[0 : i] + ')' + open * '(' + close* ')';
            break;
             
    return next;
 
 
# Driver code
if __name__ == "__main__" :
 
    s = "((()))";
 
    print(next_balanced_sequence(s));
 
    # This code is contributed by AnkitRai01


C#
// C# implementation of the approach
using System;
 
class GFG
{
     
// makes a string containing char d
// c number of times
static String strings(int c, char d)
{
    String s = "";
    for(int i = 0; i < c; i++)
    s += d;
     
    return s;
}
     
// Function to find the lexicographically
// next balanced bracket
// expression if possible
static String next_balanced_sequence(String s)
{
    String next = "-1";
    int length = s.Length;
    int depth = 0;
    for (int i = length - 1; i >= 0; --i)
    {
 
        // Decrement the depth for
        // every opening bracket
        if (s[i] == '(')
            depth--;
 
        // Increment for the
        // closing brackets
        else
            depth++;
 
        // Last opening bracket
        if (s[i] == '(' && depth > 0)
        {
            depth--;
            int open = (length - i - 1 - depth) / 2;
            int close = length - i - 1 - open;
 
            // Generate the required String
            next = s.Substring(0, i) + ')' +
                        strings(open, '(') +
                        strings(close, ')');
            break;
        }
    }
    return next;
}
 
// Driver code
public static void Main(String []args)
{
    String s = "((()))";
 
    Console.WriteLine(next_balanced_sequence(s));
}
}
 
// This code is contributed by Princi Singh


Javascript


输出:
(()())

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程