您现在的位置是:首页 > 编程 > 

中心扩展法求回文子串的长度

2025-07-20 10:19:53
中心扩展法求回文子串的长度 中心扩展法求回文子串的长度回文串是指正读和反读结果相同的字符串,如"level"、“deed”。本文介绍一种利用中心扩展法求解最长回文子串的方法。算法思路给定一个字符串s,我们遍历字符串的每个字符,以当前字符为中心向两边扩展,同时记录扩展的回文子串的长度。由于回文串可以是奇数或偶数长度,我们分别考虑以当前字符为中心和以当前字符和下一个字符为中心的情况

中心扩展法求回文子串的长度

中心扩展法求回文子串的长度

回文串是指正读和反读结果相同的字符串,如"level"、“deed”。本文介绍一种利用中心扩展法求解最长回文子串的方法。

算法思路

给定一个字符串s,我们遍历字符串的每个字符,以当前字符为中心向两边扩展,同时记录扩展的回文子串的长度。由于回文串可以是奇数或偶数长度,我们分别考虑以当前字符为中心和以当前字符和下一个字符为中心的情况。

具体算法如下:

代码语言:javascript代码运行次数:0运行复制
class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.length(); // 字符串长度
        if (n < 2) {
            return s; // 如果字符串长度小于2,直接返回原字符串
        }
        
        int start = 0; // 最长回文子串的起始位置
        int maxLength = 1; // 最长回文子串的长度
        
        for (int i = 0; i < n; i++) { // 遍历字符串
            // 对称中心是一个字符
            int len1 = expandAroundCenter(s, i, i); // 以当前字符为中心扩展,得到的回文子串长度
            // 对称中心是两个字符
            int len2 = expandAroundCenter(s, i, i + 1); // 以当前字符和下一个字符为中心扩展,得到的回文子串长度
            
            // 取最长的回文子串长度,并记录起始位置
            int curMaxLen = max(len1, len2);
            if (curMaxLen > maxLength) {
                maxLength = curMaxLen;
                start = i - (maxLength - 1) / 2;
            }
        }
        
        return s.substr(start, maxLength); // 返回最长回文子串
    }
    
private:
    // 中心扩展法求回文子串的长度
    int expandAroundCenter(ct string& s, int left, int right) {
        int n = s.length();
        while (left >= 0 && right < n && s[left] == s[right]) {
            left--;
            right++;
        }
        return right - left - 1;
    }
};

代码解析

首先,我们定义了一个名为Solution的类,其中包含了我们要实现的算法。该类中有一个公共成员函数longestPalindrome,用于接收一个字符串s并返回最长的回文子串。

longestPalindrome函数中,我们首先获取输入字符串的长度。若长度小于2,则直接返回原字符串。否则,我们初始化回文子串的起始位置start为0,长度maxLength为1。

接下来,我们使用一个for循环遍历字符串s的每个字符,以当前字符作为中心向两边扩展。具体地,分别以当前字符为对称中心和以当前字符和下一个字符为对称中心进行扩展,计算得到的回文子串的长度。

然后,我们取两种扩展情况下的最大长度curMaxLen,并记录起始位置start。计算方法是将当前字符所在位置减去(maxLength - 1)的一半,即i - (maxLength - 1) / 2

最后,我们返回使用substr函数从输入字符串s中提取最长回文子串,并以该结果作为函数的返回值。

另外,我们还实现了名为expandAroundCenter的私有成员函数,用于执行中心扩展法求解回文子串的长度。该函数使用了左右指针的方式,分别从对称中心向左右两边扩展,直到不满足回文串的条件为止。最终返回右指针和左指针的差值减1(因为循环结束后右指针与左指针已经错开了一个位置)。

总结

通过使用中心扩展法,我们可以高效地求解给定字符串中的最长回文子串。该算法的时间复杂度为O(n^2),其中n为字符串的长度。由于只使用了常数额外空间,因此空间复杂度为O(1)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-20,如有侵权请联系 cloudcommunity@tencent 删除遍历函数算法指针字符串

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1144349.html

相关标签:无
上传时间: 2025-07-19 10:34:22
留言与评论(共有 13 条评论)
本站网友 无缓冲
15分钟前 发表
最后
本站网友 bedbug
14分钟前 发表
i + 1); // 以当前字符和下一个字符为中心扩展
本站网友 何炅同性恋
8分钟前 发表
中心扩展法求回文子串的长度 中心扩展法求回文子串的长度回文串是指正读和反读结果相同的字符串
本站网友 马占文
6分钟前 发表
直接返回原字符串 } int start = 0; // 最长回文子串的起始位置 int maxLength = 1; // 最长回文子串的长度 for (int i = 0; i < n; i++) { // 遍历字符串 // 对称中心是一个字符 int len1 = expandAroundCenter(s
本站网友 天津蓝印盛世年华
21分钟前 发表
得到的回文子串长度 // 对称中心是两个字符 int len2 = expandAroundCenter(s
本站网友 天津远洋万和城
26分钟前 发表
我们首先获取输入字符串的长度
本站网友 青岛酒店预订
27分钟前 发表
以当前字符作为中心向两边扩展
本站网友 肠镜检查
30分钟前 发表
本文参与 腾讯云自媒体同步曝光计划
本站网友 石家庄骨科医院
9分钟前 发表
如"level"
本站网友 海南经济学院
11分钟前 发表
在longestPalindrome函数中
本站网友 休克的分类
28分钟前 发表
若长度小于2
本站网友 精己二酸
18分钟前 发表
另外