使用 STL 对给定字符串进行 C++ 排列

c++server side programmingprogramming

当给定字符串的字符以任何形式重新排列时,就会形成字符串的排列。在本教程中,我们将讨论如何使用 C++ 的标准模板库打印给定字符串的所有排列,例如

输入:s = “ADT”
输出:“ADT”、“ATD”、“DAT”、“DTA”、“TAD”、“TDA”
解释:在给定的输出中,您可以看到所有字符串都是由我们字符串中存在的相同三个字符组成的,只是重新排列,因此它们符合字符串排列的定义,现在还有一件事需要注意,这些都是字符串的所有可能排列。

我们可以通过两种方法打印给定字符串的所有排列

Rotate()

我们将要使用的第一种方法是使用 rotate 方法。在这个方法中,我们将使用 STL 的 rotate 函数,该函数用于旋转字符串,并且我们将使用递归来打印排列。

示例

上述方法的 C++ 代码 

#include<bits/stdc++.h>
using namespace std;
void permutations(string s, string ans){
    if(s.size() == 0) {
// 当需要旋转的字符串变为空时,这意味着
// 我们的排列存储在 ans 中
        cout << ans << "\n";
        return ;
    }
    for(int i = 0; i < s.size(); i++){
        permutations(s.substr(1), ans + s[0]);
        // 我们正在添加
        // 我们的 ans 中的第一个字符
        // 传递索引 1 中的所有元素
        // 旋转字符串以进行下一个函数。
        rotate(s.begin(), s.begin()+1, s.end());
        //旋转以使我们的第二个元素成为第一个
    }
}
int main(){
    string s = "ADT"; // 给定字符串
    permutations(s, "");
    return 0;
}

输出

ADT
ATD
DTA
DAT
TAD
TDA

Next_Permutation

现在我们将使用 STL 的另一个函数,即 next_Permutation,顾名思义,该函数的返回结果是该字符串的下一个排列是否存在。如果不存在,则返回 false。

如您所知,此函数检查下一个排列;因此,我们需要首先按字典顺序对字符串进行排序,以便获得所有可能的排列。

示例

上述方法的 C++ 代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s = "ADT"; // 给定字符串
    sort(s.begin(), s.end()); // 对字符串进行排序
    do{
        cout << s << &"\n"; // 打印排列
    }while(next_permutation(s.begin(), s.end())); // 直到 next_permutations 返回 false
    return 0;
}

输出

ADT
ATD
DAT
DTA
TAD
TDA

在上面的程序中,我们对字符串进行排序,然后在 next_permutation 函数的帮助下,打印所有可能的排列。

结论

在本教程中,我们在 C++ 中借助 STL 打印给定字符串的所有可能排列。我们还学习了这个问题的 C++ 程序和一些基本的 STL 函数及其用途。我们希望本教程对您有所帮助。


相关文章