如何在 C++ 中对以下字符串序列进行排序?

Posted

技术标签:

【中文标题】如何在 C++ 中对以下字符串序列进行排序?【英文标题】:How can I sort the following sequence of strings in c++? 【发布时间】:2015-08-22 07:38:12 【问题描述】:

所以,我正在解决一个问题,该问题涉及对由左括号和右括号组成的给定字符串序列进行排序。一个n括号序列由n个"("s和n个")"s组成。

一个有效的括号序列定义如下:

您可以找到一种方法来重复擦除相邻的一对括号"()",直到它变为空。

例如,"(())" 是一个有效的括号,你可以删除第 2 和第 3 位的对,它变成"()",然后你可以把它留空。 ")()(" 不是有效的括号。现在,我想知道如何对生成的给定长度的括号序列进行排序,以使那些具有最大左括号的字符串出现在开头,并且如果两个字符串在开头具有相同数量的左括号,那么在遍历两者时字符串,无论哪个具有第一个左括号,都将首先打印。例如,对于n=3,排序后的序列将是,

((()))  // 3 opening in a row and hence first

(()()) // 2 opening (same as the one which is below this one) but has a opening bracket first

(())()

()(())

()()()

【问题讨论】:

这些字符串是否包含括号以外的内容? 没有。这些字符串只包含括号。 我认为您只需要定义一个排序并找出当前字符串是哪种排列。然后使用该数字进行排序。 使用排序算法。本质上剩下的是两个字符串的比较,这真的很容易......你的问题是什么? A 会问What have you tried? 但似乎答案是“无”。 【参考方案1】:

您可以使用标准排序算法,std::sort

默认(字典式)排序将完全符合您的要求。

【讨论】:

【参考方案2】:

我可能遗漏了一些东西,但我认为直接排序会起作用。它有点像二进制数,除了 '('')' 而不是 1s 和 0s。

#include <random>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

std::vector<std::string> tests =

    "((()))",
    "(()())",
    "(())()",
    "()(())",
    "()()()"
;

int main()

    std::shuffle(tests.begin(), tests.end(),
        std::default_random_engine(std::random_device()));

    std::cout << "\nbefore:\n";
    for(auto const& s: tests)
        std::cout << s << '\n';

    // normal sort
    std::sort(tests.begin(), tests.end());

    std::cout << "\nafter:\n";
    for(auto const& s: tests)
        std::cout << s << '\n';

示例输出:

before:
(()())
(())()
()()()
((()))
()(())

after:
((()))
(()())
(())()
()(())
()()()

【讨论】:

以上是关于如何在 C++ 中对以下字符串序列进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中对字符串数组进行排序

如何在 C++ 中对向量组元素进行排序?

如何在熊猫中对月份和年份进行排序以进行时间序列可视化?

如何在 php 中对以下数组/stdclass 对象进行排序? [复制]

在 C++ 中对向量进行分组排序

如何在 JavaScript 中对字符串进行排序