题解 | 最长回文子串

最长回文子串

https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af

#include <algorithm>
#include <string>
using namespace std;

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param A string字符串 
     * @return int整型
     */
    int getLongestPalindrome(string A) {
        int n = A.size();
        if (n == 0) return 0;

        int maxLen = 1; // 最长回文子串的长度,至少为 1

        // 中心扩展函数
	   //  先找到位置为i的一个字母或者位置为i,i+1的两个字母,假设有两个箭头,开始指向该字母或者分别指向两个字母。如果选择一个字母,其本身回文,然后每次向两边各走一步,看当前箭头指向的两个字母是否相同,相同则这两个字母也是回文中的一部分,直到不相等时返回奇数回文长度;若是两个字母,则需看两者是否相等,不相等返回0,如相等和选择单个字母时一样,进行一次两边各走一步的操作,最后可以得到偶数会问长度
        auto expandAroundCenter = [&](int left, int right) {
            while (left >= 0 && right < n && A[left] == A[right]) {
                left--;
                right++;
            }
            return right - left - 1; // 返回当前回文子串的长度
        };

        for (int i = 0; i < n; i++) {
            // 奇数长度的回文子串
            int len1 = expandAroundCenter(i, i);
            // 偶数长度的回文子串
            int len2 = expandAroundCenter(i, i + 1);
            // 更新最大长度
		    // 每一次更新i,都从i找奇数回文子串的长度和偶数回文子串的长度,最后用max(len1, len2)得出更大的一个,再与之前的maxLen做对比
            maxLen = max(maxLen, max(len1, len2));
        }

        return maxLen;
    }
};

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务