问题描述
【题目描述】
【输出】
题目解析
这道题是全排列+特殊去重的经典,手链任意转动或翻转就是去重的关键。去重的关键就是:s’是否是s的转动等价于s’是否是s+s的子串。举个例子字符串abc,要想知道cab是不是abc的转动后的结果只需看cab是不是abcabc的子串即可。这就是这道题特殊去重的关键。
C++代码
int main()
{
string s = "aaabbbbccccc";
vector<string> v1;
int ans = 0;
do //全排列的一般格式
{
int i=0;
for(;i<v1.size();i++) //排出重复,对于v1中的每个元素进行检查如果存在s的旋转或者翻转就跳过
{
if(v1[i].find(s)!=string::npos) break; //看s是否存在于当前v1[i]的子串中
}
if(i!=v1.size()) continue;
string s2=s+s;
v1.push_back(s2); //若果vector中存在当前排列,就跳过,判断旋转的情况
reverse(s2.begin(),s2.end());
v1.push_back(s2);
ans++;
}
while(next_permutation(s.begin(),s.end()));
cout<<ans<<endl;
return 0;
}