小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共有多少不同的组合样式?
输出
请你输出该整数。不要输出任何多余的内容或说明性的文字。
思路:
首先枚举字符串s的全排列;
去掉重复排列(转动和翻转),这里复制一下字符串,存入vector数组中,再翻转复制后的字符串,存入vector数组中,如果枚举字符串s的的排列中,是存入vector中字符串的子串,说明重复,break
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> v;
int res;
int main()
{
string s = "aaabbbbccccc";
do
{
int i = 0;
for (; i < v.size() ; i ++)
{
if (v[i].find(s) != string::npos) break; //如果找到了,说明是重复的,去掉
}
if(i < v.size()) continue; //重复
string ss = s + s;
v.push_back(ss);
reverse(ss.begin(),ss.end());
v.push_back(ss);
res++;
}while(next_permutation(s.begin(),s.end()));
cout << res << endl;
return 0;
}