题目描述
游游定义一个字符串是“好串”,当且仅当该字符串相邻的字符不相等。例如"arcaea"是好串,而"food"不是好串。
游游拿到了一个字符串,她可以将该字符串的各个字符顺序随意打乱。她想知道一共可以生产多少种不同的好串?
输入描述:
一个仅包含小写字母的字符串,长度不超过10。
输出描述:
好串的数量。
示例1
输入
aab
输出
1
说明
只有"aba"这一种好串。
示例2
输入
arc
输出
6
解题思路
这道题思路并不难,给我们一个字符串,让我们求组成这个字符串的所有字符,它们构成的所有串是不是好串。判断是否为好串只需判断字符串的每个字符的相邻字符是否相等,都不相等为好串。 难点就在于求所有字符串,一个一个遍历暴力来做肯定会超时,这里简单介绍一下next_permutation()这个函数,他再algorithm库中。用途是来求下一个全排列,与之对应的还有perv_permutation(),是求上一个全排列,两者用法相同。 我们常用next_permutation(),用法如下: 基本定义如下:
next_permutaion(首地址,末地址+1) 默认升序排序
next_permutaion(始地址,末地址+1,自定义排序)
string,vector这些数据结构不能直接写名字,只能够使用自带的迭代器begin()、end()实现全排列。使用默认升序排序时,首先要先对数组或字符串进行升序排序:sort(s.begin(), s.end()); 然后,进行全排列,一般模板如下:
do
{
//对排列出的数组或字符串进行操作处理
} while(next_permutation(s.begin(),s.end()));
大括号里的内容就是我们要对数组,字符串进行的操作,比如这题是进行判断该排列是否为好串。 如果使用prev_permutation()默认对全排列降序排序,则要对数组或字符串进行降序排序。
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> PII;
const int N = 210;
signed main()
{
string s;
cin >> s;
sort(s.begin(), s.end());
int cnt = 0;
do
{
bool flag = false;
for (int i = 0; i < s.size() - 1; i++)
{
if (s[i] == s[i + 1])
{
flag = true;
break;
}
}
if (!flag) cnt++;
} while (next_permutation(s.begin(), s.end()));
cout << cnt;
return 0;
}