小红的回文串构造
原创 于 2024-01-29 15:34:16 发布 · 粉丝可见 · 749 阅读 · 4 · 9 · 本内容遵循CC 4.0 BY-SA版权协议 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/135912970
本题链接: 登录—专业IT笔试面试备考平台_牛客网
题目:

样例1:
样例2:
思路:
由题意,题目保证给出的字符串是回文串的,所以我们只需要获取两个不同的字符的对应对称的两个坐标进行交换即可构造完毕。
这里有一个关键点,就是我们如何知道当前的下标 i 的堆成下标是多少?
关于 i 对称的下标,肯定有一个规律关系,其中对称又有两种方式。
其中奇数串对称:
1 2
| 奇数串对称: dcabacd 偶数串对称:dcabbacd 1234567 12345678
|
观察对应的下标 i 就可以找出一定的规律为 :
1 2 3 4 5 6 7
| 当前的下标 i 的对称下标 j 一定为: j = (s.length() % 2 ? i + (s.length() / 2 - i) * 2: i + (s.length() / 2 - i) * 2 - 1); 奇数串的时候 : j = i + (s.length() / 2 - i) * 2 偶数串的时候 : j = i + (s.length() / 2 - i) * 2 - 1
|
所以结合以上规律即可构成出答案了。
这里也有个小细节,就是我们只需要遍历回文串的一半即可。
否则会将奇数串中的对称点也作为第二个不同的字符。
代码详解如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include <iostream> #include <cstring> using namespace std;
struct Char { char now; int i; int j; inline Char():now('-'),i(-1),j(-1){} }; signed main() { string s; getline(cin,s); int sz = s.size(); if(sz <= 3) { cout << -1 << endl; return 0; } Char a,b; for(int i = 0;i < sz / 2;++i) { if(a.now == '-') { a.now = s[i]; a.i = i; a.j = (sz % 2 ? i + (sz / 2 - i) * 2 : i + (sz / 2 - i) * 2 - 1); }else { if(b.now == '-' and s[i] != a.now) { b.now = s[i]; b.i = i; b.j = (sz % 2 ? i + (sz / 2 - i) * 2 : i + (sz / 2 - i) * 2 - 1); break; } } } if(a.now == '-' || b.now == '-') { cout << -1 << endl; return 0; } s[a.i] = s[a.j] = b.now; s[b.i] = s[b.j] = a.now; cout << s << endl; return 0; }
|
最后提交:
