想法:
若有 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]]; 这一操作。导致超时