LeetCode5:最长回文子串

LeetCode5:最长回文子串

题目说明

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

示例 2:

输入: “cbbd”
输出: “bb”

分析

按一个数字为中心,然后左右展开来判断是否相同,注意要分以一个数字为中心,如“babad”,或者以两个数字为中心,如“cbbd”。这种情况,写一个通用的函数借口来实现。
由于返回的是最长子串,所以要定义一个最大长度的变量,来对每次得到的一个子串的长度作比较,如果比上次大,那就把它遍历的最左边的下标返回。这里利用下标可以统计字符串的长度,就不用再定义不断加1的变量。

C++代码

class Solution {
public:
    string longestPalindrome(string s) {
        int index = 0; //索引,返回最长回文子串的第一个字符
        int maxlen = 0;
        if(s.size() <= 1) {
            return s;
        }
        for(int i = 0; i < s.size(); i++) {
            //由于要对以一个或两个数为中心的情况做判断,所以直接封装成一个函数
            search(s,i,i,index,maxlen);            
            search(s,i,i+1,index,maxlen);
        }
        return s.substr(index, maxlen);
    }
    void search(string s, int left, int right, int& index, int& maxlen) {
        while( left >= 0 && right < s.size() && s[left] == s[right]) {
            //cout<<s[left]<<endl;
            left--;right++;
        }
        //注意这里的长度是right-left-1,left往左right往右多了一位
        if( maxlen < right-left-1 ) {
            maxlen = right-left-1;
            index = left + 1;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值