传智杯 第六届—第二场—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;
}
相关推荐
千纸鹤安安4 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者6 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
卷无止境11 小时前
C++ 的Eigen 库全解析
c++
卷无止境11 小时前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴12 小时前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
kisshyshy12 小时前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC1 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635071 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法