一、分析题目
算法思路:由于题目要找的是最短的回文子串,并且只有三个字母: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 这一要求,审题不仔细!