小红的回文串构造

2024-01-29 17:28
文章标签 构造 回文 小红

本文主要是介绍小红的回文串构造,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本题链接:登录—专业IT笔试面试备考平台_牛客网

题目:

样例1:

输入
abba

输出
baab

样例2:

输入
aba

输出
-1

思路:

        由题意,题目保证给出的字符串是回文串的,所以我们只需要获取两个不同的字符的对应对称的两个坐标进行交换即可构造完毕。

        这里有一个关键点,就是我们如何知道当前的下标 i 的堆成下标是多少?

        关于 i 对称的下标,肯定有一个规律关系,其中对称又有两种方式。

        其中奇数串对称:

奇数串对称:    dcabacd            偶数串对称:dcabbacd1234567                      12345678

        观察对应的下标 i 就可以找出一定的规律为 : 

当前的下标 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

        所以结合以上规律即可构成出答案了。

        这里也有个小细节,就是我们只需要遍历回文串的一半即可。

        否则会将奇数串中的对称点也作为第二个不同的字符。

        代码详解如下:

#include <iostream>
#include <cstring>
using namespace std;// 用于存储不同的字符
struct Char
{char now;int i;    // 当前下标 iint j;    // 对称下标 jinline Char():now('-'),i(-1),j(-1){}    // 默认构造函数
};
signed main()
{string s;getline(cin,s);int sz = s.size();    // 获取字符串长度if(sz <= 3){cout << -1 << endl; // 特判如果 小于等 3 那么一定是无解return 0;}Char a,b;    // 定义结构体用于存储两个不同的字符for(int i = 0;i < sz / 2;++i)    // 遍历对应回文串的一半即可{// 如果 a 还没存储好,我们现在给它存储if(a.now == '-'){a.now = s[i];a.i = i;// 存储对称下标 ja.j = (sz % 2 ? i + (sz / 2 - i) * 2 : i + (sz / 2 - i) * 2 - 1);    }else{if(b.now == '-' and s[i] != a.now)    // 出现不同 a 的字符{b.now = s[i];b.i = i;// 存储对称下标 jb.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;
}

最后提交:

这篇关于小红的回文串构造的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657640

相关文章

csu1328(近似回文串)

题意:求近似回文串的最大长度,串长度为1000。 解题思路:以某点为中心,向左右两边扩展,注意奇偶分开讨论,暴力解即可。时间复杂度O(n^2); 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#inclu

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的 构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。 简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是 要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时, 如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。

Java构造和解析Json数据的两种方法(json-lib构造和解析Json数据, org.json构造和解析Json数据)

在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别。下面首先介绍用json-lib构造和解析Json数据的方法示例。 一、介绍       JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json

CF #278 (Div. 2) B.(暴力枚举+推导公式+数学构造)

B. Candy Boxes time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/488/problem/B There

MemSQL Start[c]UP 2.0 - Round 1A(构造)

题目链接:http://codeforces.com/problemset/problem/452/A 解题思路: 打个表暴力查找匹配。 完整代码: #include <algorithm>#include <iostream>#include <cstring>#include <complex>#include <cstdio>#include <strin

Codeforces Round #281 (Div. 2)A(构造+暴力模拟)

题目链接:http://codeforces.com/problemset/problem/493/A 解题思路: 暴力的判断,分三种情况去判断即可。注意如果之前已经被罚下场后,那么在后面的罚下情况不应该算在输出结果内。 完整代码: #include <algorithm>#include <iostream>#include <cstring>#include <co

Codeforces Round #233 (Div. 2)A(构造)

题目链接:http://codeforces.com/contest/399/problem/A 解题思路: 构造出来即可,考虑p-k和p+k两个边界分别于1和n作比较,对左右符号特殊处理。 完整代码: #include <algorithm>#include <iostream>#include <cstring>#include <complex>#include

Codeforces Round #247 (Div. 2)A(构造)

题目链接:http://codeforces.com/contest/431/problem/A 解题思路: 构造出来即可。 完整代码: #include <algorithm>#include <iostream>#include <cstring>#include <complex>#include <cstdio>#include <string>#inc