1. 程式人生 > >最長迴文子串(動態規劃和遞迴)

最長迴文子串(動態規劃和遞迴)

給一個字串,找出它的最長的迴文子序列的長度。例如,如果給定的序列是“BBABCBCAB”,則輸出應該是7,“BABCBAB”是在它的最長迴文子序列。 “BBBBB”和“BBCBB”也都是該字串的迴文子序列,但不是最長的。注意和最長迴文子串的區別(參考:最長迴文串)!這裡說的子序列,類似最長公共子序列LCS( Longest Common Subsequence)問題,可以是不連續的。這就是LPS(Longest Palindromic Subsequence)問題。

最直接的解決方法是:生成給定字串的所有子序列,並找出最長的迴文序列,這個方法的複雜度是指數級的。下面來分析怎麼用動態規劃解決。

1)最優子結構

假設 X[0 ... n-1]  是給定的序列,長度為n.  讓 L(0,n-1) 表示 序列 X[0 ... n-1] 的最長迴文子序列的長度。

1. 如果X的最後一個元素和第一個元素是相同的,這時:L(0, n-1) = L(1, n-2) + 2 ,  還以 “BBABCBCAB” 為例,第一個和最後一個相同,因此 L(1,n-2) 就表示藍色的部分。

2. 如果不相同:L(0, n-1) = MAX ( L(1, n-1) ,  L(0, n-2) )。 以”BABCBCA” 為例,L(1,n-1)即為去掉第一個元素的子序列,L(0, n-2)為去掉最後一個元素。

有了上面的公式,可以很容易的寫出下面的遞迴程式:

01 #include<stdio.h>
02 #include<string.h>
03 int lps(char *seq, int i, int j)
04 {
05 //一個元素即為1
06 if (i == j)
07 return
 1;
08 if(i > j) return 0; //因為只計算序列 seq[i ... j]
09
10 // 如果首尾相同
11 if (seq[i] == seq[j])
12 return lps (seq, i+1, j-1) + 2;
13
14

相關推薦

動態規劃

給一個字串,找出它的最長的迴文子序列的長度。例如,如果給定的序列是“BBABCBCAB”,則輸出應該是7,“BABCBAB”是在它的最長迴文子序列。 “BBBBB”和“BBCBB”也都是該字串的迴文子序列,但不是最長的。注意和最長迴文子串的區別(參考:最長迴文串)!這

leetcode5. 動態規劃

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2: 輸入: "cbbd" 輸出: "bb" 解題思路: 採用動態規劃的

LeetCode 5. C、C++、python

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba" 也是一個有效答案。 示例 2: 輸入: "cbbd" 輸出: "bb

題目:C++

ptr 這位 優化 png 技術分享 ring tdi xen 回文 看到這個題第一反應是做過啊,然後就開始寫,等寫完一測。emmmmm,原來是最長回文子串不是最長回文子序列,但是寫都寫了,我就把代碼稍微修改了一下讓適應於該題目,代碼如下: static const au

數組中的升序序列動態規劃問題

ace dia mic enc namespace 進行 strong main log The longest Increasing Subsequence (LIS) 給定一個序列,找到這個序列的一個最長的子序列,使得子序列的所有元素是升序的,且元素之間的相對位置不變

Longest Palindromic Substring

題目描述: 給出一個字串(假設長度最長為1000),求出它的最長迴文子串,你可以假定只有一個滿足條件的最長迴文串。 樣例 給出字串 "abcdzdcab",它的最長迴文子串為 "cdzdc"。 挑戰 O(n2) 時間複雜度的演算法是可以接受的,如果你

leetcode演算法題—golang—題5

題目:最長迴文子串 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2: 輸入: "cbb

leetcode 51

第一種就是從中間開始判斷,分為兩種情況,長度為奇數還是偶數,但是時間複雜度為O(n^2),程式碼如下 char* longestPalindrome(char* s) { int low,length,high,j,k; printf("%s\n",s); length=str

演算法題:C#實現

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba" 也是一個有效答案。 示例 2: 輸入: "cbbd" 輸出: "bb

LeetCode第五題:C語言

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 解法一:暴力求解法 思想:

Manacher演算法------求Java)

最長迴文子串 對於一個字串,請設計一個高效演算法,計算其中最長迴文子串的長度。 給定字串A以及它的長度n,請返回最長迴文子串的長度。 測試樣例: "abc1234321ab",12 返回:7 public class Main {      public st

Manacher模板

該演算法就是處理一個字串中的最長迴文子串,在後綴陣列中看到過相對的解法,時間複雜度可以優化到o(n),但是相對程式碼量太大,而面對迴文串演算法有相對更簡單的方法,可以很簡單的處理出來,程式碼量小,時間也

多種解法

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest

Longest Palindromic Substring——三種時間複雜度的解法

public String longestPalindrome(String s) {        List<Character> s_new = new ArrayList<>();        for(int i = 0;i < s.length();i++){     

Manacharo(n)

0. 問題定義最長迴文子串問題:給定一個字串,求它的最長迴文子串長度。如果一個字串正著讀和反著讀是一樣的,那它就是迴文串。下面是一些迴文串的例項:12321 a aba abba aaaa tattarrattat(牛津英語詞典中最長的迴文單詞)1. Brute-force

【51NOD-0】1089 V2Manacher算法

lose 最長回文子串 gif () none print struct hide pac 【算法】回文樹 #include<cstdio> #include<algorithm> #include<cstring> using na

51nod 1089 V2Manacher算法

clu 記得 file 越界 str tool algorithm scanf ++i 1089 最長回文子串 V2(Manacher算法) 基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 收藏 關註

編程之法:面試算法心得

高效 pre 記錄 特殊字符 一段 stp ace 分開 枚舉 內容全部來自編程之法:面試和算法心得一書,實現是自己寫的使用的是java 題目描述 給定一個字符串,求它的最長回文子串的長度。 分析與解法 最容易想到的辦法是枚舉所有的子串,分別判斷其是否為回文。這個思路初看起

,On復雜度

16px 2個 ida strip 問題 們的 repo 紅色 rep 最長回文子串問題—Manacher算法 最長回文串問題是一個經典的算法題。 0.

hdu-3294

pre har solution mes pos 最長 chan ret 最長回文子串 題意:給你一個字符和一個字符串讓你求出最長回文子串並且輸出來,答案需要根據給出的字符轉換一下,就是將給出的字符認定為a,然後依次向後推; 解題思路:manacher模板+一些處理 代碼: