小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?
注意下面查找字串和全排列的操作,这里需要注意 string s, s.find(*iter) != s.end() 会报错
而且还不能用 auto 定义变量,emmm
所以要学会如何定义迭代器 , 对于 vector 可以这样定义:` vector
next_permutation(s.begin(),s.end()) 的返回值为bool类型,直接改变了 s 的内容, reverse 也是直接改变 s 的内容,输入的参数都是首尾迭代器。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<iterator>
using namespace std;
int main(){
vector<string> ans;
string s ="aaabbbbccccc";
ans.push_back(s);
int i = 0;
while(next_permutation(s.begin(),s.end())){
// cout << i++ <<endl;
//检测是否含有,这个技巧可以有
string s2 = s+s;
int flag = 0;
for(vector<string>::iterator iter = ans.begin();iter!=ans.end();iter++){
if(s2.find(*iter) != string::npos) {
flag = 1;break;
}
}
if(flag) continue;
//检测是否可以反转
reverse(s.begin(),s.end()) ;
for(vector<string>::iterator iter = ans.begin();iter!=ans.end();iter++){
if(s2.find(*iter)!= string::npos) {
flag = 1;break;
}
}
if(!flag) ans.push_back(s),cout << ans.size()<<endl;;
}
cout << ans.size() <<endl;
return 0;
}
原文:https://www.cnblogs.com/wei-huan/p/10586155.html