牛客对应题目链接:非对称之美 (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),不过它是回文(对称)的,这里要求找的是最长非回文字串的长度,所以我就按着之前的思路去思考,也是将其分为奇数长度和偶数长度的扩展来想。不过,我发现这种思路会导致一些重复字符组成的子串没法得出正确结果,但又不知道该从哪里改起,所以需要转换一下思路。
这道题目没有太多其它的技巧,就是直接找规律,也可以说是贪心,是从非回文的特性来找出非回文的最长字串长度。