p92 最长回文子串(leetcode 5)
一:解题思路
方法一:Time:O(n^2),Space:O(1)
方法二:Time:O(n^2),Space:O(1)
相同的Java程序改到C++却不能运行有点奇怪!还是把程序贴上。原因可能之后会想出来!
二:完整代码示例 (C++版和Java版)
C++:
方法一:
class Solution { public: string longestPalindrome(string s) { if (s == "" || s.length() == 0) return s; int n = s.length(); int start = 0; int maxLen = 0; vector<vector<bool>> d(n,vector<bool>(n,false)); for (int i = n - 1; i >= 0; i--) { for (int j = i; j < n; j++) { if (i == j) d[i][j] = true; else if (i + 1 == j) d[i][j] = (s[i] == s[j]); else d[i][j] = ((s[i]==s[j]) && (d[i+1][j-1])); if (d[i][j] && (j - i + 1 > maxLen)) { start = i; maxLen = j - i + 1; } } } return s.substr(start,maxLen); } };
方法二:
class Solution { private: int expand(string s, int left, int right) { while (left >= 0 && right < s.length() && s[left] == s[right]) { left--; right++; } return right - left - 1; } public: string longestPalindrome(string s) { if (s.length() == 0) return ""; int maxLen = 0; int start = 0; for (int i = 0; i < s.length(); i++) { int len1 = expand(s, i, i); int len2 = expand(s, i, i + 1); int len = max(len1, len2); if (len > maxLen) { start = i - (len - 1) / 2; maxLen = len; } } return s.substr(start, start + maxLen); } };
方法一Java:
class Solution { public String longestPalindrome(String s) { if(s==null || s.length()==0) return ""; int n=s.length(); int start=0; int maxLen=0; boolean d[][]=new boolean[n][n]; for(int i=n-1;i>=0;i--) { for(int j=i;j<n;j++) { if(i==j) d[i][j]=true; else if(i+1==j) d[i][j]=s.charAt(i)==s.charAt(j); else d[i][j]=s.charAt(i)==s.charAt(j) && d[i+1][j-1]; if(d[i][j] && j-i+1>maxLen) { start=i; maxLen=j-i+1; } } } return s.substring(start,start+maxLen); } }
方法二Java:
class Solution { private int expand(String s,int left,int right) { while (left>=0 && right<s.length() && s.charAt(left)==s.charAt(right)) { left--; right++; } return right-left-1; } public String longestPalindrome(String s) { if(s==null || s.length()==0) return ""; int maxLen=0; int start=0; for(int i=0;i<s.length();i++) { int len1=expand(s,i,i); int len2=expand(s,i,i+1); int len=Math.max(len1,len2); if(len>maxLen) { start=i-(len-1)/2; maxLen=len; } } return s.substring(start,start+maxLen); } }

浙公网安备 33010602011771号