leetcode 05 最长回文子串——中心扩展法

最长回文子串——中心扩展法

解法思路
  1. 首先考虑到从中心向两边扩展的两种情况,一种是对称中心就是某个元素,另一种是对称中心在两个元素之间。所以中心扩展函数的形参列表中有两个指针,分别向前和向后搜索。依次遍历字符串中的每个字符时,分两种情况,第一种是以当前字符为中心,则传入的头尾指针指向的都是当前字符;第二种情况是头指针指向当前字符,尾指针指向当前字符的后一个字符。比较这两种返回的字符串长度,去较长的那一个保留。
  2. 所以在设计中心扩展函数的时候就要考虑到这一点,中心扩展函数中有两个指针(head和tail),head向左搜索,tail向右搜索,如果各自指向的元素相等就继续,否则停止搜索,并返回substring[head+1, tail-1]之间的元素(因为此时head和tail指向的元素已经不是相等的了)
代码实现
class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size() < 2){return s;}
        string result = ""; 	//用于保存最终的最长子串
        for(int i = 0; i < s.size(); i++){
            string temp = "";	//用于保存两种情况下的最长子串
            string oddstr = centerSpread(s, i, i);  //奇数情况
            string evenstr = centerSpread(s, i, i+1);   //偶数情况
            temp = oddstr.size() > evenstr.size() ? oddstr: evenstr;
            if(temp.size() > result.size()){
                result = temp;
            }
        }
        return result;
    }
    //中心拓展函数
    string centerSpread(string str, int head, int tail){
        int i = head;
        int j = tail;
        
        while((i>=0) && (j < str.size())){
            if(str[i] == str[j]){
                i--;
                j++;
            }
            else{
                break;
            }                
        }
        return str.substr(i+1, j-i-1);       
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值