Longest Palindromic Substring

题目描述

这里写图片描述

解题思路

题目要求从一个字符串s的子字符串中找到一个最长的回文字符串,那么解题思路显而易见,1是要求子字符串是回文字符串,2是要求该字符串是最长的。
回文字符串有个显然的特征是沿着中心那个字符轴对称。所以对于每个字符串我们只需要从中心向两端展开,观察两端的字符是否相同即可判断是否为回文字符串,而最长这一点,我们可以设置个变量longest,每次遍历完一个子字符串都与longest做比较。这样时间复杂度就是O(n^2)。

c++代码实现

class Solution {
public:
    string Palindrome(string s, int left, int right) {  
        int length = s.length();  
        while (left >= 0 && right < length && s[left] == s[right]) {  
            left--;  
            right++;  
        }  
        return s.substr(left + 1, right - left -1);  
    }  

    string longestPalindrome(string s) {
        int n = s.length();  
        if (n == 0) return "";  
        string longest = s.substr(0, 1); 
        for (int i = 0; i < n-1; ++i) {  
            string s1 = Palindrome(s, i, i);  
            if (s1.length() > longest.length()) longest = s1;

            string s2 = Palindrome(s, i, i+1); 
            if (s2.length() > longest.length()) longest = s2;  
        }  
        return longest;  
    }
};

运行结果:
这里写图片描述

反思与总结

此题难度一般,但凡设计到回文字符串,一般都会采用我上面的解题思路,但这里阐述了更为简洁的做法,不得不佩服其境界之高!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值