BM73. 最长回文子串
描述
对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。
示例1
输入:
"ababc"
输出:
3
说明:
最长的回文子串为"aba"与"bab",长度都为3示例2
输入:
"abbba"
输出:
5
示例3
输入:
"b"
输出:
1
C++ 解法, 执行用时: 2ms, 内存消耗: 416KB, 提交时间: 2022-02-09
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param A string字符串 * @return int整型 */ pair<int,int> checkPalidrome(const string &A,int left,int right){ while(left>=0&&right<A.size()&&A[left]==A[right]){ --left,++right; } return {left+1,right-1}; } int getLongestPalindrome(string A) { int start=0,end=0; // write code here int n_size=A.size(); for(int i=0;i<n_size;i++){ auto [l,r]=checkPalidrome(A, i, i); if(r-l>end-start){ end=r,start=l; } auto [l1,r1]=checkPalidrome(A, i, i+1); if(r1-l1>end-start){ end=r1,start=l1; } } return end-start+1; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2021-12-08
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param A string字符串 * @return int整型 */ int getLongestPalindrome(string A) { // write code here int res = 0, step; for (int i = 0; i < A.size(); i += step) { int l = i - 1, r = i + 1; step = 1; while (r < A.size() && A[i] == A[r]) { ++r; ++step; } while (l >= 0 && r < A.size() && A[l] == A[r]) { ++r; --l; } res = max(res, r-l-1); } return res; } };
C 解法, 执行用时: 2ms, 内存消耗: 540KB, 提交时间: 2021-11-12
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param A string字符串 * @param n int整型 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 */ int getLongestPalindrome(char* A, int n ) { // write code here int left,right; int len=0; int step; if(n==0) return 0; for(int i=0;i<n;i=i+step) { step=1; left=i-1; right=i+1; while(A[right]!='\0'&&A[right]==A[i]) { right++; step++; } while(left>=0 && A[right]!='\0'&&A[left]==A[right]) { left--; right++; } if(right-left-1>len) len=right-left-1; } return len; }
C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-01-16
class Solution{ public: int getLongestPalindrome(string A) { // write code here if(A.size()==0||A.size()==1) return A.size(); int max_lens=1; for(int i=0;i<A.size();i++) { int j=i,k=i+1; while(j>=0&&k<A.size()&&A[j]==A[k]) { if(k-j+1>max_lens) { max_lens=k-j+1; } j--; k++; } } for(int i=0;i<A.size();i++) { int j=i-1,k=i+1; while(j>=0&&k<A.size()&&A[j]==A[k]) { if(k-j+1>max_lens) { max_lens=k-j+1; } j--; k++; } } return max_lens; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2021-12-11
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param A string字符串 * @return int整型 */ int getLongestPalindrome(string A) { // write code here int res=0; int len=A.size(); int i=0; //for(int i=0;i<len;i++) while(i<len) { int left=i; int right=i; if(len-i<res/2) break; while(right<len && A[right]==A[right+1]) { right++; } i=right+1; while(left>=1 &&right<len && A[left-1]==A[right+1]) { left--; right++; } res=max(res,right-left+1); } return res; } };