【题目】
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?
一开始的错误想法:把圆形手链变成链状,以红色为第一颗珠子。计算十二颗珠子以红色为起点有多少种组合方式,再除以三得到。
然后很显然是错误的,虽然错误原因我也不是很清楚,可能是没有考虑翻转?
后来看了一下老师的讲解视频,感觉可以学习的小点还挺多
【完整代码】
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
string s="aaabbbbccccc";
vector<string> v1;
int ans=0;
do{
int i = 0;
for(;i<v1.size();++i){
if(v1[i].find(s)!=string::npos)break; //找到了,说明重复了
}
if(i!=v1.size())continue;
string s2=s+s;
v1.push_back(s2);
reverse(s2.begin(),s2.end());
v1.push_back(s2);
ans++;
}while(next_permutation(s.begin(),s.end()));
cout<<ans<<endl;
return 0;
}
【笔记】
1、全排列方法(永远记不住!希望下次可以记得住)
在do语句块中不能改变s!!!不然会退出循环
#include<algorithm>
do{}
while(next_permutation(s.begin(),s.end()));
2、v1为vector类型,判断字符串s是否为v1中某个字符串的子字符串,string:npos表示没找到
for(int i=0;i<v1.size();++i){
if(v1[i].find(s)!=string::npos)break;
}
3、判断s1是否为s的旋转 等价于 s1是否为s+s的子字符串