标签:
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.
Tags: String
容易想到的思路(可以解但会超时):
class Solution { public: string longestPalindrome(string s) { int len = s.length(); for(int n=len; n>=1; n--){ for(int i=0; i<=len-n; i++){ if(isPalin(s.substr(i,n))){ return s.substr(i,n); } } } } bool isPalin(string sub){ int len = sub.length(); for(int i=0,j=len-1; i<j; i++,j--){ if(sub[i]!=sub[j]) return false; } return true; } };
更好的思路:
上述思路相当于先构建一系列子字符串,然后分析每个子串是否回文数,这样将会有非常多的组合,计算复杂度高。这种思路其实是收缩的思路。
如果我们从前往后遍历,每次遍历到一个字符便以之为中心看能向两边扩散多远,从而形成一些列子串,如果形成的子串长度大于result,则更新result。这种思路是扩散的思路。
此题其实与LeetCode Algorithm 03有类似之处,即都不能直接构造固定长度字符串然后判断是否合乎要求。正确的做法都是先设定一个子串的出发点(端点或中心点),然后尽可能增长直到不满足条件,形成子串,然后更新原有的局部最佳子串,最终形成全局最长子串。
c++代码:
1 class Solution { 2 public: 3 string centerToOutside(string s, int left, int right){ 4 while(left>=0 && right<=s.length()-1 && s[left]==s[right]){ 5 left--;right++; 6 } 7 return s.substr(left+1, right-left-1); 8 } 9 10 string longestPalindrome(string s) { 11 int len = s.length(); 12 if(len == 0){ 13 return ""; 14 } 15 string result = s.substr(0,1); 16 for(int i=0; i<len-1; i++){ 17 string s1 = centerToOutside(s, i, i); 18 if(s1.length() > result.length()){ 19 result = s1; 20 } 21 string s2 = centerToOutside(s, i, i+1); 22 if(s2.length() > result.length()){ 23 result = s2; 24 } 25 } 26 return result; 27 } 28 29 };
标签:
原文地址:http://www.cnblogs.com/chen0958/p/4356492.html