牛客对应题目链接:小红的ABC (nowcoder.com)
一、分析题目
算法思路:由于题目要找的是最短的回文子串,并且只有三个字母:a、b、c,因此最短的回文子串的长度要么是 2,要么是 3。因此,我们仅需枚举所有的⼆元组以及三元组就好了。
二、代码
1、看题解之前AC的代码
#include <iostream>
using namespace std;
int main()
{
string s;
cin >> s;
int n=s.size();
int len=101;
for(int i=0; i<n; i++)
{
//奇数长度的扩展
int left=i, right=i;
while(left>=0 && right<n && s[left]==s[right])
{
if(right-left+1<len && right-left+1>1) len=right-left+1;
left--;
right++;
}
//偶数长度的扩展
left=i, right=i+1;
while(left>=0 && right<n && s[left]==s[right])
{
if(right-left+1<len && right-left+1>1) len=right-left+1;
left--;
right++;
}
}
if(len>1 && len<101) cout << len << endl;
else cout << -1 << endl;
return 0;
}
2、值得学习的代码
#include <iostream>
#include <string>
using namespace std;
string s;
int main()
{
cin >> s;
int ret = -1; // 有可能并没有回⽂串
int n = s.size();
for(int i = 0; i < n; i++)
{
if(i + 1 < n && s[i] == s[i + 1]) // 判断⻓度为 2 的⼦串
{
ret = 2;
break;
}
if(i + 2 < n && s[i] == s[i + 2]) // 判断⻓度为 3 的⼦串
{
ret = 3;
}
}
cout << ret << endl;
return 0;
}
三、反思与改进
没仔细看题目要求我就直接按着之前写过的:5. 最长回文子串 - 力扣(LeetCode)思路去写了,忽略了题目要找的是最短的回文子串,并且只有三个字母:a、b、c 这一要求,审题不仔细!