第19届上海大学程序设计联赛春季赛简单题记录

第19届上海大学程序设计联赛春季赛简单题记录

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. .注意边界问题,要么从1开始,要么从0开始
  2. 在下标的计算的时候,一定不要算错了
  3. 注意判断对应的字符相等,不要判断错了

代码

#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;
}

请求

小哥哥,小姐姐,喜欢的话,就点个赞吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值