LeetCode Algorithms 5. Longest Palindromic Substring
阿新 • • 發佈:2019-02-06
題目難度: Medium
原題描述:
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example:
Input: "cbbd" Output: "bb"
題目大意:
給你一個字串,讓你輸出它的最長迴文子串。
解題思路:
首先要知道迴文子串的定義:從前面往後讀和從後面往前讀是一樣的子串。既然要求其中最長的迴文子串,首先想到的方法就是列舉每一個子串,看其是否為迴文串,找到其中最長的迴文子串。但是這種方法的時間複雜度比較高,達到了O(n^3)。
有一種比較好的方法,就是從子串的中心往外擴充套件,看其是否為迴文串。具體做法就是列舉以每一個字元為中心的子串,在擴充套件的過程中看中心的左右字元是否一樣,要注意的是子串長度為奇數和偶數是不一樣的,奇數時時以一個字元為中心,偶數時是以兩個字元為中心。
時間複雜度分析:
列舉每一個作為中心的字元需要O(n)的時間複雜度,在確定中心後,向左右擴充套件需要O(n)的時間複雜度,因此總的時間複雜度為O(n^2)。
以下是程式碼:
char* longestPalindrome(char* s) { int len = strlen(s); int ans=0 ,temp; int left , right; for(int i=0 ; i<len ; ++i){ //奇數的情況 for(int j=0 ; (i-j>=0) && (i+j<len) ; ++j){ temp = 2*j+1; if(s[i-j]==s[i+j]){ if(temp > ans){ ans = temp; left = i-j; right = i+j; } } else break; } //偶數的情況 for(int j=0 ; (i-j>=0) && (i+j+1<len) ; ++j){ temp = 2*(j+1); if(s[i-j]==s[i+j+1]){ if(temp > ans){ ans = temp; left = i-j; right = i+j+1; } } else break; } } char * result = (char *)malloc(right-left+2); memcpy(result , s+left , right-left+1); *(result+right-left+1) = '\0'; return result; }