GESP2024年9月认证C++三级( 第三部分编程题(2、回文拼接)

张开发
2026/4/10 9:02:47 15 分钟阅读

分享文章

GESP2024年9月认证C++三级( 第三部分编程题(2、回文拼接)
‍♂️ 一、故事背景镜子王国的魔法字符串在一个神奇的王国里有一种“镜子字符串”✨ 从左读和从右读是一样的比如aba abba这些叫做——回文串 二、任务目标1国王给你一个字符串比如aabbb2他说 你要判断 能不能把它切成两段前一段 后一段3并且✔ 每一段都是回文✔ 每一段长度 ≥ 2 三、核心思路1、 思考步骤1 枚举“切的位置”比如aabbb2可以切成aa | bbb ✅ aab | bb ❌3 判断方法1️⃣ 切开字符串2️⃣ 判断左右两段是不是回文3️⃣ 只要有一种成功 → Yes 四、如何判断“回文” 方法简单把字符串反过来看是否一样原串 反转后的串 五、举例讲解 示例1abcd1尝试切ab | cd ❌ abc | d ❌2 没有成功3 输出No 示例2aabbb1尝试aa | bbb2回文判断 aa 是回文 ✔ bbb 是回文 ✔3 成功 输出Yes 示例3aaac1尝试aa | ac ❌ aaa | c ❌2 不行3 输出No 六、完整解题步骤 魔法流程1️⃣ 读入字符串2️⃣ 枚举切割点 j3️⃣ 分成两段s1 前面 s2 后面 //两边长度都要大于24️⃣ 判断s1 是回文 s2 是回文5️⃣ 成功 → Yes6️⃣ 否则 → No 七、参考代码#include bits/stdc.h using namespace std; // 判断一个字符串是否是回文 bool isPalindrome(string s) { string t s; reverse(t.begin(), t.end()); return s t; } int main() { int n; cin n; while(n--) { string s; cin s; int len s.length(); bool ok false; // 枚举切割点 for(int i 2; i len - 2; i) // 两边长度都至少为2 { string left s.substr(0, i); string right s.substr(i); if(isPalindrome(left) isPalindrome(right)) { ok true; break; } } if(ok) cout Yes\n; else cout No\n; } return 0; }⚠️ 八、需要避的坑 1切的位置不能太靠边i 2 到 len-2 因为✔ 每一段长度 ≥ 2 2substr用法s.substr(起点, 长度) 右边可以直接写s.substr(i) 3回文判断reverse 比较 九、魔法口诀总结✨ “中间切一刀”✨ “左右看一看”✨ “都是回文串”✨ “成功说 Yes”

更多文章