如何在 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】:我可能遗漏了一些东西,但我认为直接排序会起作用。它有点像二进制数,除了 '('
和 ')'
而不是 1
s 和 0
s。
#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++ 中对以下字符串序列进行排序?的主要内容,如果未能解决你的问题,请参考以下文章