题目描述:
假设字符串s的最大长度为1000,而且有唯一的最长回文,找到s的最长回文子字符串;
思路一:
- 首先写出判断一个字符串是不是回文的方法
- 遍历整个字符串,找出其中可以做回文中间数的那些字符(两个连续字符相等,或者字符两边的数相等),再进一步判段是不是回文,并找出该段回文的长度
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; } };