欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 字符串重排问题

字符串重排问题

2025/2/25 18:02:22 来源:https://blog.csdn.net/2301_80882026/article/details/143106214  浏览:    关键词:字符串重排问题

小红拿到了一个仅由小写字母组成的字符串,她希望你能重排这个字符串,使得每个对应位置的字符和重排前都不相同。你能帮帮她吗?

一个仅由小写字母组成的字符串。长度不超过 1 0 5 10^5 105

如果无解,请输出-1。
否则输出任意合法字符串。

输入

aba

aba```输出
--\-1

-1```
输入

abbc

abbc```输出
--bcab

bcab```

说明

思路:对于这种问题,我们很容易的判断不行的情况是有一种字母 * 2 大于总的数量,然后我们将所有的存到一个二元组内,first代表字符,second代表位置,然后我们根据字符进行排序,将相同的字符排在一起,我们同时偏移maxs最后所生成的答案就是符合的。也是一个小结论吧

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int M = 1e9 + 7;
const int MOD = 998244353;
typedef long long ll;
typedef pair<ll,ll>PII;
typedef pair<char, int>PCI;
//字符串偏移maxs即可
PCI p[N];
char c[N];
int main()
{map<char, vector<int>>ma;string s;cin >> s;int n = s.size(), maxs = 0;for(int i = 0; i < n; i ++){ma[s[i]].push_back(i);p[i] = {s[i], i};maxs = max((int)ma[s[i]].size(), maxs);}if(maxs * 2 >= n) cout << -1 << endl;else {sort(p, p + n);//开始偏移for(int i = 0; i < n; i ++){c[p[i].second] = p[(i + maxs) % n].first;}for(int i = 0; i < n; i ++) cout << c[i];}return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词