牛客对应题目链接:非对称之美 (nowcoder.com)
一、分析题目
找规律:
- 判断是否全都是相同字符。
- 判断本身是否是回文。
- 如果这个字符串每个字符相同,不存在非回文子串,直接返回 0。
- 如果这个字符串不是回文,输出字符串长度。
- 贪心:如果这个字符串是回文,输出这个字符串长度 -1。(重点:最后返回 n-1 的含义)
二、代码
//值得学习的代码
#include <iostream>
#include <string>using namespace std;int n;
string s;int fun()
{// 1. 判断是否全都是相同字符bool flag = false;for(int i = 1; i < n; i++){if(s[i] != s[0]){flag = true;break;}}if(flag == false) return 0;// 2. 判断本⾝是否是回⽂flag = true;int left = 0, right = n - 1;while(left < right){if(s[left] == s[right]){left++;right--;}else{flag = false;break;}}if(flag) return n - 1;else return n;
}int main()
{cin >> s;n = s.size();cout << fun() << endl;return 0;
}
三、反思与改进
拿到这道题时,我想起了之前写过的5. 最长回文子串 - 力扣(LeetCode),不过它是回文(对称)的,这里要求找的是最长非回文字串的长度,所以我就按着之前的思路去思考,也是将其分为奇数长度和偶数长度的扩展来想。不过,我发现这种思路会导致一些重复字符组成的子串没法得出正确结果,但又不知道该从哪里改起,所以需要转换一下思路。
这道题目没有太多其它的技巧,就是直接找规律,也可以说是贪心,是从非回文的特性来找出非回文的最长字串长度。