题目描述:
题目解读:
给定字符串长度n和它的前缀、后缀字符串,判断原字符串是否为回文。
前缀:如果从字符串b的末尾删除几个(可能为零个或全部)字符可以获得字符a,字符串a是字符串b的前缀。
后缀:通过从字符串b的开头删除几个(可能为零个或全部)字符可以获得字符a,字符串a是字符串b的后缀。
解题思路:
想要从给定的前缀和后缀中恢复字符串显然很难。
但是给定了前缀和后缀,其中长度为n-1的前缀和后缀就是字符串删除尾字符和首字符,得到的字符串。
我们可以找到这个规律:如果原字符串为回文,那两个长度为n-1的前缀和后缀组合起来依然是回文。
所以可以遍历所有前缀后缀,得到长度为n-1的前缀和后缀,把他俩组合成新的字符串,然后判断该字符串是否为回文即可。
代码实现:
#include <stdio.h>
#include<iostream>
using namespace std;
void Solve() {
int n;
string s;
int i = 0;
int flag = 0;
string str;
scanf("%d", &n);
for (i = 0; i < 2*n-2; i++) {
cin>>s;
if (s.length() == n - 1) {
str += s;
}
}
for (i = 0; i < 2 * n - 2; i++) {
if (str[i] == str[2 * n - 2 - i - 1]) {
flag = 0;
}
else {
flag = 1;
printf("NO\n");
break;
}
}
if (!flag) printf("YES\n");
return;
}
int main() {
int t;
scanf("%d", &t);
while (t--) Solve();
return 0;
}
遇到的错误: