LeetCode&&Longest Palindromic Substring

来源:互联网 发布:艾默生网络能源 编辑:程序博客网 时间:2024/05/21 17:36

题目描述:

假设字符串s的最大长度为1000,而且有唯一的最长回文,找到s的最长回文子字符串;

思路一:

  1. 首先写出判断一个字符串是不是回文的方法
  2. 遍历整个字符串,找出其中可以做回文中间数的那些字符(两个连续字符相等,或者字符两边的数相等),再进一步判段是不是回文,并找出该段回文的长度
    class Solution {public:    string longestPalindrome(string s) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.        int len = s.length();        int temp_longest = 1;        string temp_str;        //遍历从第二个开始直到倒数第二个字符串        //找出所有符合回文中间字符串特征的字符串        for(int i=1;i<len-1;i++){            if(s[i]==s[i-1]){                int j;                string substr;                for(j=1;j<i;j++){                    //一找到的中间值为轴,向两端扩展,判断子字符串是否为回文                    //向前取到i-1-j位,向后取到i+j位                    //所以子字符串的长度为因(i+j)-(i-1-j)+1=2j+2                    substr = s.substr(i-1-j,2*j+2);                    //当向后超过数组长度                    if((i+j)>len-1){                        break;                    }                    if(!isPalindrome(substr)){                        break;                    }                }                //所取字符串的长度为(i+j-1)-((i-1)-(j-1))+1;由于包含开始的数本身,所以加一                int temp=2*j;                if(temp>temp_longest){                    temp_longest=temp;                    //从(i-1)-(j-1)开始取,                    temp_str=s.substr(i-j,temp);                }            }            if(s[i-1]==s[i+1]){                int j;                for(j=1;j<i;j++){                    //原理同上,只是向前取到i-j,向后取到i+j                    //字串长度为2j+1;                    string substr = s.substr(i-j,2*j+1);                    if((i+j)>len-1){                        break;                    }                    if(!isPalindrome(substr)){                        break;                    }                }                //所取字符串长度为(i+j-1)-(i-j-1)+1                int temp=2*j+1;                if(temp>temp_longest){                    temp_longest=temp;                    //从(i-1)-(j-1)开始取,                    temp_str=s.substr(i-j,temp);                }            }        }        return temp_str;    }    bool isPalindrome(string s){        int len = s.length();        for(int i = 0 ;i<=len-1;i++){            if(s[i]!=s[len-1-i]){                return false;            }        }        return true;    }};