传智杯 第六届—第二场—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;
}
相关推荐
CoderCodingNo2 分钟前
【GESP】C++五级真题(埃氏筛思想考点) luogu-B3929 [GESP202312 五级] 小杨的幸运数
数据结构·c++·算法
charlee444 分钟前
C++中JSON序列化和反序列化的实现
c++·json·序列化·结构体·nlohmann/json
机器学习之心11 分钟前
基于PSO-GA混合算法的施工进度计划多目标优化,以最小化总成本并实现资源均衡,满足工期约束和资源限制,MATLAB代码
算法·matlab·多目标优化·pso-ga混合算法
bbq粉刷匠14 分钟前
Java--二叉树概念及其基础应用
java·数据结构·算法
CodeByV15 分钟前
【算法题】前缀和
算法
挖矿大亨21 分钟前
c++中值传递时是如何触发拷贝构造函数的
开发语言·c++
高洁0123 分钟前
知识图谱构建
人工智能·深度学习·算法·机器学习·知识图谱
郝亚军23 分钟前
顺序栈C语言版本
c语言·开发语言·算法
AndrewHZ30 分钟前
【图像处理基石】什么是神经渲染?
图像处理·人工智能·神经网络·算法·cnn·计算机图形学·神经渲染
2401_8414956433 分钟前
【LeetCode刷题】爬楼梯
数据结构·python·算法·leetcode·动态规划·滑动窗口·斐波那契数列