传智杯 第六届—第二场—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;
}
相关推荐
会员源码网16 小时前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing17 小时前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader18 小时前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱20 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8971 天前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮1 天前
AI视觉连载8:传统 CV 之边缘检测
算法
RuoZoe2 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
blasit2 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
AI软著研究员2 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish2 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack