大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
字符串处理,回文串判断
题目解答方法的文字分析
题目要求在一群牛的编号中找出最长的回文串。回文串是指正读反读都一样的字符串。
思路:
- 遍历给定的字符串 s,以每个字符为中心,向两边扩展,查找以当前字符为中心的最长回文串。
- 由于回文串可能是奇数或偶数长度的,因此需要考虑两种情况:以当前字符为中心的奇数长度回文串和偶数长度回文串。
- 在扩展过程中记录当前找到的最长回文串,并在遍历完所有字符后返回结果。
举例说明:例如,给定字符串 "babad",以每个字符为中心,向两边扩展,最长的回文串是 "babad"。
本题解析所用的编程语言
C++
完整且正确的编程代码
class Solution { public: string longestPalindrome(string s) { if (s.empty()) { return ""; } int start = 0; // 记录最长回文串的起始位置 int maxLen = 0; // 记录最长回文串的长度 for (int i = 0; i < s.length(); ++i) { // 以当前字符为中心的奇数长度回文串 int len1 = expandAroundCenter(s, i, i); // 以当前字符和下一个字符为中心的偶数长度回文串 int len2 = expandAroundCenter(s, i, i + 1); int len = max(len1, len2); // 如果当前找到的回文串更长,则更新记录 if (len > maxLen) { maxLen = len; start = i - (len - 1) / 2; } } return s.substr(start, maxLen); } private: // 扩展以 left 和 right 为中心的回文串,并返回回文串的长度 int expandAroundCenter(string& s, int left, int right) { while (left >= 0 && right < s.length() && s[left] == s[right]) { left--; right++; } // 注意:因为跳出循环时左右指针已经多移动了一位,所以计算长度要减 1 return right - left - 1; } };