刷题笔记

【leetcode刷题笔记】005.Longest Palind

2018-09-11  本文已影响0人  常恒毅
日期:20180911
题目描述:

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Examples 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Examples 2:
Input: "cbbd"
Output: "bb"
详解:

这道题我很机智的想出了从中间往两边找的方法,这样最坏时间复杂度就是O(n^2)。但是一开始做的时候没有想到长度为偶数的回文字符串。并且我一开始定义了一个i和j,两边就是i-j和i+j。这样到了偶数长度的回文字符串就非常麻烦,不如定义一个左指针j一个右指针k。这种时候不要嫌定义的变量多。下面是我的代码:

class Solution {
public:
    string longestPalindrome(string s) {
        int start=0,maxlen=1;
        for(int i=0;s[i]!='\0';i++){
            int j = i - 1,k = i + 1;
            while(j>=0&&s[k]!='\0'&&s[j]==s[k]){
                j--;
                k++;
            }
            if(k-j-1>maxlen){
                maxlen=k-j-1;
                start = j+1;
            } 
        }
        for(int i=0;s[i]!='\0';i++){
            int j = i,k = i + 1;
            while(j>=0&&s[k]!='\0'&&s[j]==s[k]){
                j--;
                k++;
            }
            if(k-j-1>maxlen){
                maxlen=k-j-1;
                start = j+1;
            } 
        }
        return s.substr(start,maxlen);
    }
};

这次终于击败了70%的C++使用者。

然后看了一下比我速度快的代码,如下所示:

class Solution {
public:
    string longestPalindrome(string s) {
        int start = 0; int maxLen = 0;
        int l = 0, r = 0;
        for(int i = 0; i < s.size();) {
            l = r = i;
            while(r < s.size() - 1 && s[r] == s[r + 1])
                r++;
            i = r + 1;
            while(l > 0  && r < s.size() - 1 && s[l - 1] == s[r + 1]) {
                l--;
                r++;
            }
            int len = r - l + 1;
            if(len > maxLen) {
                start = l;
                maxLen = len;
            }
        }
        return s.substr(start, maxLen);
    }
};

他的代码中,如果遇到非常多重复的字母(包括两个),会直接把这些字母视为一个,例如"cbbbbbbbefgh"最后l指针会是指向最左边的"b",r指针会指向最右边的"b",然后让i等于r+1这样下次就直接从e开始,这样一并解决了奇偶回文的问题,还在有很多连续重复字符的时候节省了时间。

妙啊!妙啊!

上一篇下一篇

猜你喜欢

热点阅读