Leetcode中級演算法之最長迴文子串(5)C++
阿新 • • 發佈:2018-12-01
給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。
示例 2:
輸入: “cbbd”
輸出: “bb”
這道題在網上看到了許多解法,如動態規劃,馬拉車解法,看得一知半解,最後找到一個求最長子串長度的解法,在它的基礎上得到了如下通俗解法,時間複雜度為O(N^2)
class Solution { public: string longestPalindrome(string s) { int n = s.length(); if(n < 1) return ""; int count=0, maxLen=0; for(int i=0;i<n;i++) { for(int j=0;(i-j)>=0&&(i+j)<n;j++) //當子串長度為奇數時 { if(s[i-j] != s[i+j]) break; count = 2 * j + 1; if(count > maxLen) maxLen = count; } for(int k=0;(i-k)>=0&&(i+k+1)<n;k++) //當子串長度為偶數時 { if(s[i-k] != s[i+k+1]) break; count = 2 * k + 2; if(count > maxLen) maxLen = count; //到此步得到了原字串的最長子串的長度maxLen } } for(int i=0;i<=n-maxLen;i++) //從原陣列擷取maxLen長度的子串,為迴文就返回 { string longestSubstr = s.substr(i,maxLen); if(ishuiwen(longestSubstr)) return longestSubstr; } } bool ishuiwen(string s) //判斷字串是否為迴文 { if(s.length()<2) return true; int n = s.length(); for(int i=0;i<n/2;i++) if(s[i] != s[n-i-1]) return false; return true; } };
思路:迴圈原字串,以每一個字元為中點向左右遍歷,得到最長子迴文串的長度maxLen(注意子串長度的奇偶),然後擷取maxLen長度的子串判斷是否為迴文即可.