题目描述:
小红拿到了一个只包含 '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;
}