传智杯 第六届—第二场—C

题目描述:

小红拿到了一个只包含 'a' , 'b' , 'c' 三种字符的字符串。小红想知道,这个字符串最短的、长度超过 1 的回文子串的长度是多少?

子串定义:字符串取一段连续的区间。例如"abcca"的子串有"ab"、"bcca"等,但"aca"则不是它的子串。回文的定义:一个字符串正着读和倒着读都是相同的,那么定义它的回文的。

输入描述:

一个只包含 'a' , 'b' , 'c' 三种字符的字符串。数据范围:字符串长度不小于2,且不超过100。

输出描述:

如果不存在长度超过1的回文子串,则输出-1;否则输出长度超过1的最短回文子串的长度。

示例1

输入:

复制代码
abcca

输出:

复制代码
2

说明:

"cc"即为其最短回文子串。

示例2

输入:

复制代码
abcab

输出:

复制代码
-1

解题思路:

本题的解题思路很直接,直接从第一个字符开始遍历,将其与最后一个字符进行从后往前比较,如果相同则将j++,k--,即比较下一组的字符,如果不相同则j退回到原位,k回到最开始比较的上一个位置重新进行比较,比较过程类似于字符串匹配算法中的暴力匹配算法,只不过暴力匹配算法是两个字符串进行比较,而本题是字符串首尾进行比较。当j>=k的时候,就代表有一个回文子串的存在,将这个子串长度和最小的子串长度进行比较,保留最小的长度即可。

注意:

①输出的为最小的回文子串的长度。

代码:

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
int  main()
{
	string arr;   //表示字符串
	getline(cin, arr);

	int min = 100;   //用于记录最长回文子串的字符个数
	for (int i = 0;i < arr.length();i++)
	{
		for (int g = arr.length() - 1;g > i;g--)
		{
			int j = i;
			int k = g;
			while (arr[j] == arr[k])
			{
				j++;k--;   //判断下一对是否一样
				if (j >= k)
				{
					min < g - i + 1 ? min = min : min = g - i + 1;
					break;
				}
			}
		}
	}
	//输出
	min != 100 ? cout << min << endl : cout << "-1" << endl;

	system("pause");
	return 0;
}
相关推荐
同学小张15 小时前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native
轻抚酸~16 小时前
KNN(K近邻算法)-python实现
python·算法·近邻算法
Yue丶越18 小时前
【C语言】字符函数和字符串函数
c语言·开发语言·算法
小白程序员成长日记19 小时前
2025.11.24 力扣每日一题
算法·leetcode·职场和发展
有一个好名字19 小时前
LeetCode跳跃游戏:思路与题解全解析
算法·leetcode·游戏
爱学习的小邓同学19 小时前
C++ --- 多态
开发语言·c++
AndrewHZ20 小时前
【图像处理基石】如何在图像中提取出基本形状,比如圆形,椭圆,方形等等?
图像处理·python·算法·计算机视觉·cv·形状提取
蓝牙先生20 小时前
简易TCP C/S通信
c语言·tcp/ip·算法
Old_Driver_Lee20 小时前
C语言常用语句
c语言·开发语言
松涛和鸣21 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法