B-Lin88’s Palindrome
题意
问题传输门
这个题是从普通的回文串演变过来的,普通的回文串的判断是O(n)的复杂度。普通的回文串只需要对称判断。比如 当前str字符串数组的长度为 n,下标从0开始。
判断语句
bool flag = true;//假设当前判断这数组是回文串
for (int i = 0;i < n / 2;i ++)
{
if (str[i] == str[n-1-i]) ;//简答推导
else {
flag = false;
break;
}
}
if (flag )//最后的结果
思考
上面是简单的回文串判断。而这个题是改变存在字符串的字符,判断改变后是否为回文串。若是,则输出 Yes,否则输出No。这个题的数据1e5的范围,多次测试T的范围是1e5。暴力的做法是上面的做法,细节就不详说了。我们思考一个问题,回文串是怎样判断的?
回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。仔细思考定义,我们会发现一个规律------数组长度的等距(点到中点的距离相等)的数值相等可以判断回文数。我们在上面是直接循环判断,并没有记录下来变换几个数可以让其成为回文串。这里运用到记忆化存储的思想。我们需要通过一次循环来找出当前对应(等距点的数值)的字符是否相等。我们定义一个int类型的变量来存储对应不等的个数。若num== 0则是回文串。
偶数
a b c d num: 4
a b b d num: 2
c b b d num: 2
d b b d num: 0
奇数
a b a num: 0
a c a num: 0
c c a num: 2
对应的数不等,则 num += 2,因其两个数
细节
看了样例,最后讨论细节。细节在样例中,认真的你一定看出来了。具体的算法过程就看代码吧
- .注意边界问题,要么从1开始,要么从0开始
- 在下标的计算的时候,一定不要算错了
- 注意判断对应的字符相等,不要判断错了
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int main ()
{
string str;
cin >> str;
int res = 0;
int len = str.size();
for (int i = 0;i < len/2;i ++)
{
if (str[i] != str[len-i-1]) res += 2;
}
int t;
cin >> t;
while (t--)
{
int x;
char c;
cin >> x >> c;
int y = len -x ;
if (str[x-1] == str[y]){
if (c != str[x-1])
{
str[x-1] = c;
if(len % 2 != 0 && (x-1) == len / 2);
else res += 2;
}
}
else
{
if (c != str[x-1])
{
str[x-1] = c;
if (c == str[y])
{
res -= 2;
}
}
}
if (res == 0) puts("Yes");
else puts("No");
}
return 0;
}
请求
小哥哥,小姐姐,喜欢的话,就点个赞吧。