SP2426 PLD - Palindromes 题解

本文介绍了如何使用C语言编程解决一个题目,即统计给定字符串中所有长度为k的回文子串的数量。通过遍历字符串并逐个检查子串是否为回文,利用字符比较实现高效的计数。
摘要由CSDN通过智能技术生成

题目传送门

题目大意

题目描述

您将得到一个数字 k k k 和一个长度不超过 30000 30000 30000 个小写字母的非空字符串 S S S
我们说两个回文串是不同的仅为回文串的开始位置不同。请你求出 S S S 包含多少个长度为 k k k 的不同的回文串?

数据范围

∣ S ∣ |S| S 为字符串 S S S 的长度。
对于 100 % 100\% 100% 的数据满足, 2 ≤ k ≤ 3 × 1 0 4 , 1 ≤ ∣ S ∣ ≤ 3 × 1 0 4 2 \leq k \leq 3\times 10^4,1\le|S|\le3\times10^4 2k3×104,1S3×104 S S S 只包含小写字母。

解题思路

令子串的起始位置为 l l l,结束位置为 r r r

如果同时枚举 l l l r r r 的话是两层循环,再加上一层判断是否为回文串的循环,时间复杂度为 O ( n 3 ) O(n^3) O(n3),很明显是会超时的。

因此,我们尝试只枚举每个子串的起始位置 l l l,可以发现结束位置一定为 i + k − 1 i + k - 1 i+k1 r = i + k − 1 r = i + k - 1 r=i+k1。我们都知道回文串满足从前往后看与从后往前看相同,所以我们就可以从起始位置 l l l 向后出发,同时从结束位置 r r r 向前出发,如果 a l ≠ a r a_l \neq a_r al=ar 的话,说明这个子串不是回文串,否则继续上述操作,直到 l ≥ r l\geq r lr 停止。

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int k, len, ans;
char str[30010];
int main() {
	scanf("%d%s", &k, str);
	len = strlen(str);
	for (int i = 0; i <= len - k; i++) {
		int s = i, e = i + k - 1;
		bool flag = 0;
		while (s < e) {
			if (str[s++] != str[e--]) {
				flag = 1;
				break;
			}
		}
		if (!flag)
			ans++;
	}
	printf("%d\n", ans);
	return 0;
}

并集矩阵
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值