leetcode_question_5 Longest Palindromic Substring

来源:互联网 发布:网络信息监控采集技术 编辑:程序博客网 时间:2024/06/10 13:31

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

stupid method:

int self_in_mid(string s, int index){        int length = 1;        int size = s.length();        while((index-length >= 0) && (index + length < size)){            if(s[index-length] == s[index + length]) length ++;            else break;        }        return (length - 1)*2 + 1;    }    int self_with_left(string s, int index){        int length = 1;        int size = s.length();        while((index-length >= 0) && (index + length -1 < size)){            if(s[index-length] == s[index + length - 1]) length ++;            else break;        }        return (length - 1)*2;    }        string longestPalindrome(string s) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        if(s.length() < 2) return s;                int ssize = s.length();        int maxposition1 = 1;        int maxlength1 = 1;        int maxposition2 = 1;        int maxlength2 = 0;        for(int i = 1; i < ssize; ++i){            int tmp = self_in_mid(s,i);            if(tmp > maxlength1){                maxlength1 = tmp;                maxposition1 = i;            }            tmp = self_with_left(s,i);            if(tmp > maxlength2){                maxlength2 = tmp;                maxposition2 = i;            }        }                if(maxlength1 > maxlength2)        return s.substr(maxposition1 - (maxlength1-1)/2, maxlength1);        else        return s.substr(maxposition2 - maxlength2/2, maxlength2);    }

dp:

下面的这段代码在leetcode上面运行报error:


然后我就想在本地调试,看看哪出问题了,同样的代码添加了两行输出之后在本机运行,输出为:


同样的代码不同的输出!这是哪出问题了?没想通。。。

class Solution {public:    char S[2002];    int P[2002];    string longestPalindrome(string s) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        int ssize = s.length();        int slength = 0;S[slength++] = '$';for(int i = 0; i < ssize; ++i){S[slength++] = '#';S[slength++] = s[i];}S[slength] = '#';int id = 0;int mx = 0;for(int i = 1; i < slength; ++i){if(mx > i) P[i] = P[2*id-i] < (mx-i) ? P[2*id-i] : (mx-i);else P[i] = 1;while(S[i-P[i]] == S[i+P[i]])++P[i];if(i+P[i]>mx){mx = i+P[i]; id = i;}}mx = 1;for(int i = 1; i < slength; ++i)if(P[i]>mx){mx = P[i];id = i;}--mx;return s.substr((id-mx+1)/2-1, mx);    }};

add codes as follows, it is Accepted!

memset(P,0,sizeof(int)*2002);memset(S,'0',sizeof(char)*2002);



class Solution {public:    char S[2002];    int P[2002];    string longestPalindrome(string s) {        // Start typing your C/C++ solution below        // DO NOT write int main() function    memset(P,0,sizeof(int)*2002);        memset(S,'0',sizeof(char)*2002);        int ssize = s.length();        int slength = 0;S[slength++] = '$';for(int i = 0; i < ssize; ++i){S[slength++] = '#';S[slength++] = s[i];}S[slength] = '#';int id = 0;int mx = 0;for(int i = 1; i < slength; ++i){if(mx > i) P[i] = P[2*id-i] < (mx-i) ? P[2*id-i] : (mx-i);else P[i] = 1;while(S[i-P[i]] == S[i+P[i]])++P[i];if(i+P[i]>mx){mx = i+P[i]; id = i;}}mx = 1;for(int i = 1; i < slength; ++i)if(P[i]>mx){mx = P[i];id = i;}--mx;return s.substr((id-mx+1)/2-1, mx);    }};