最长回文子串--动态规划
給定一個字符串s,找到s中最長的回文子串. 你可以假設 s 的最大長度為1000.
示例1
輸入: "babad" 輸出: "bab" 注意: "aba" 也是一個有效答案。
示例2
輸入: "cbbd" 輸出: "bb"
解法一: 暴力解法
根據回文子串的定義,枚舉所有長度大于等于2的子串,以此判斷它們是否是回文.在具體實現中,可以只針對大于“當前得到的最長回文子串長度”的子串進行回文子串.下面我們用暴力解法,列舉出所有的,但是時間超出了限制,但是還是將這種方式貼出來
import Foundation //想要導入,否則string無subString方法
func longestPalindrome(_ s: String) -> String {
guard s.count > 0 else {return ""}
if s.count == 1 {return s}
var maxLen: Int = 1
let range = NSRange(location: 0, length: 1)
let result = (s as NSString).substring(with: range)
var resultStr = result as String
for i in 0..<s.count - 1 {
for j in i + 1..<s.count {
if j - i + 1 > maxLen && valid(s, left1: i, right1: j) {
maxLen = j - i + 1
let range = NSRange(location: i, length: maxLen)
let result = (s as NSString).substring(with: range)
resultStr = result
}
}
}
return resultStr
}
//判斷回文
func valid(_ s: String, left1: Int, right1: Int) -> Bool {
let strArr = Array(s)
var left: Int = left1
var right: Int = right1
while left < right {
if strArr[left] != strArr[right] {
return false
}
left = left + 1
right -= 1
}
return true
}
然后在leetCode上提交,但是時間超過了限制,給出的結果如下:
解法二: 動態規劃
解法一的時間復雜度過高,在leetCode上并不能AC.下面有改進方法
首先我們定義P(i,j) 如下
接下來
P( i , j ) = (P( i + 1, j - 1 )&& S[ i ] == S[ j ])
所以如果我們知道了P( i, j )的情況,不需要調用判斷回文串的函數了,只需要知道P( i + 1, j - 1 )的情況就可以了,這樣時間復雜度就會減少了O(n), 因此我們采取動態規劃的方案,用空間換取時間,把已經求出來的P(i, j)存儲起來.
如果S[i + 1, j -1]是回文串, 那么只要S[i] == S[j] 就可以確定S[i, j]是回文串.
求長度為1和長度為2的P(i,j)時不能用上邊的公式,因為帶上去,發現越界,所以要分兩種情況考慮.
所以我們先初始化長度為1的回文串的P(i,j),利用上面的提出的公式,然后兩邊向外各擴充一個字符,長度為3, 5的,所有的長度就求出來了.
同理, 初始化長度為2的回文串,利用公式,得到了長度為4, 6的所有偶數長度就都求出來了.
代碼如下:
class Solution {
public String longestPalindrome(String s) {
int length = s.length();
if (length == 1){return s;}
boolean[][] P = new boolean[length][length];
int maxLen = 0;
String maxPal = "";
for (int i = 1; i <= length; i++) //遍歷所有的長度
for (int j = 0; j < length; j++) {
int k = i + j - 1;
if (k >= length) //下標已經越界,結束本次循環
break;
P[j][k] = (i == 1 || i == 2 || P[j + 1][k - 1]) && s.charAt(j) == s.charAt(k); //長度為 1 和 2 的單獨判斷下
if (P[j][k] && k > maxLen) {
maxPal = s.substring(j, k + 1);
}
}
return maxPal;
}
}
上面就是動態規劃方法,還會持續更新,希望大家關注!??!
總結
以上是生活随笔為你收集整理的最长回文子串--动态规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二代身份证号码编码规则
- 下一篇: 微光如何投屏腾讯视频(这个怎么用腾讯视频