想法:
若有 a ,b ,c 三个字符
只需要
a->b
b->c
c->a
以此类推
就能保证
1. t的字符集和s的相同(去重后的,也就是说不考虑数量)
2. t的每个位置的字符都和s不同。
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
string s;
cin>>s;
unordered_map <char,char> m;
char a=s[0],b;
for(int i=1;i<s.size();i++)
{
if(m.count(s[i])==false)//如果s[i]没有映射关系,就与上一个字符a映射 a->s[i]
//如果出现连续相同的,会创建 a->a这样的映射关系,
//但是不用担心,最后是能映射到下一个字符或者第一个字符上
{
b=s[i];
m[a]=b;
a=b;
}
}
m[a]=s[0]; //把最后一个没有映射的字符映射到第一个上
//string output;
if(m.size()==1) //如果只有一组映射,说明是 该字符->该字符,即不满足题意,输出-1
{
cout<<"-1";
return 0;
}
for(int i=0;i<s.size();i++)//逐位输出字符
{
cout<<m[s[i]];
//output = output + m[s[i]];
}
//cout<<output;
}
在最开始的代码中,字符串构建 output 时使用了 output = output + m[s[i]]; 这一操作。导致超时

京公网安备 11010502036488号