1. 程式人生 > >動態規劃-最長迴文串

動態規劃-最長迴文串

1. 最長迴文串

給定一個字串 s,找到 s 中最長的迴文子串。假設 s 的最大長度為1000。

示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba"也是一個有效答案。

示例 2:

輸入: "cbbd"
輸出: "bb"

dp[j][i]表示s[j]至s[i]所表示的子串是否為迴文子串,是則為1,不是為0。如此根據S[j]是否等於s[i],可以把問題分為兩類:

(1)s[j]==s[i],那麼只要s[j+1]s[i1]是迴文子串,s[j]s[i]就是迴文子串;如果

s[j+1]s[i1]是不是迴文子串,則s[j]s[i]也不是迴文子串。

(2)s[j]!=s[i],那麼s[j]s[i]一定不是迴文子串
狀態轉移方程:

dp[j][i]={dp[j+1][i1],s[j]==s[i]0,s[j]!=s[i]
string longestPalindrome(string s){
    int n=(int)s.size();
    //記錄最長迴文串的長度
    int max_len=1
; //記錄迴文串開始的下標 int start=0; //狀態陣列 int dp[1001][1001]={0}; for(int i=0;i<n;i++){ for(int j=0;j<=i;j++){ //如果i,j相鄰或者相等,直接判斷是否相等 if(i-j<2)dp[j][i]=s[j]==s[i]; //否則判斷頭尾是否相等而且減去頭尾後是否為迴文串 else dp[j][i]=(dp[j+1][i-1]&&s[i]==s[j]); if
(dp[j][i]&&max_len<i-j+1){ //如果是迴文串,而且最大長度有更新,則記錄 max_len=i-j+1; start=j; } } } return s.substr(start,max_len); }

相關推薦

動態規劃-

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

(動態規劃)

程式碼 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <time.h> #include <

-從動態規劃到"馬拉車"之路(下)

預備知識: (1)在一個數軸上有兩點i和j(i<=j)關於點m對稱,那麼有 i = 2m-j;  證明: 因為 i<=j 且 i 和 j 關於 m 對稱,那麼有 (i + j)/ 2 = m  所以 i = 2m - j; (2)迴文串的對稱性:  由迴文串的

JAVA動態規劃(二)--公共子序列問題(LCS_subSequence)的三種解法與公共子字串(LCS_subString)的兩種解法與(LongestPalindrome)

動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。 為了節約重複求相同子問題的時間,引入一個數組,不管它們是否對最終

leetcode 求

題目:Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.         樣例

演算法 -- 四種方法獲取的”,並對時間複雜進行分析對比&PHP

迴文串: “迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。 -- 來自百度百科 關於獲取字串中最長的迴文串的演算法中,目前有很多演算法,本文中主要是用PHP來實現的演算法之一。 演算法一:暴力解法 暴力計算出所有的字串並判斷。時間複雜

【3068 HDU】

題目:點選開啟題目連結 思路:這題要用到迴文串匹配的知識點。我們之前遇到這種題傳統思想就是分奇數和偶數情況進行暴力,從前往後遍歷每一個字元,然後以該字元為中心向兩邊查詢,但這樣的時間複雜度很高,是O(n^2),提交的話,肯定會wa。這裡介紹一種新的演算法,Manacher演算法。 Manac

LeetCode---409.

題目連結:https://leetcode-cn.com/problems/longest-palindrome/description/ 題目描述:  演算法描述: 分析下題目我們可以容易知道,只要某個字元的個數為偶數個的時候,那麼這些字元一定可以構成迴文數(因為題目沒

【LeetCode】 409.

1.題目 給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 “Aa” 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 2.思路 建立map存放26個大小寫字母的數量; 如果該字

409.

給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 "Aa" 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示例 1: 輸入:"abccccdd" 輸出:7 解釋: 我們可以構造

【LeetCode 簡單題】91-

宣告: 今天是第91道題。給定一個包含大寫字母和小寫字母的字串,找到可由這些字母構造成的最長的迴文串。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (手動比心ღ( ´・ᴗ・` ))

求字串中的長度 manacher演算法 模板

https://www.luogu.org/problemnew/show/P3805 #include<bits/stdc++.h> using namespace std; const int maxn=11000002; char S[maxn<<1];

O(n)的manacher演算法

參考以下兩篇文章。。。 一篇程式碼清晰  一篇解析明確。。 http://blog.sina.com.cn/s/blog_70811e1a01014esn.html http://wenku.baidu.com/link?url=kX7ZdfzHW7SM0cE8Vv

動態規劃——公共子

package com.chao.dynamicProgramming; public class LCSL { //lcsl()方法用來計算最長公共子序列的長度 public static int lcsl(int[][] c, int[

leetcode 409.

給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 "Aa" 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示

manacher演算法(

這是建立部落格記錄的第一個程式碼。 題目解釋:     子串:小於等於原字串長度由原字串中任意個連續字元組成的子序列     迴文:關於中間字元對稱的文法,即“aba”(單核)、“cabbac”(雙核)等     最長迴文子串:1.尋找回文子串;2.該子串是迴文子串中

在一個字串中找出

如何高效的在一個字串中找到最長的迴文串呢?下面我們根據程式碼來分析 首先,迴文串有兩種,一種是字串的長度是偶數,另一種就是奇數。 我們從字串第二個字元開始,同樣我們把當前起始字元叫做k 先檢驗奇數長度的字串,對比該字元的前一個和後一個(k -

lintcode 627 Python版本

Cottbuser 灣區人工智慧 今天 作者:Cottbuser 會多國語言的海歸  公眾號:灣區人工智慧 微博:灣區人工智慧 知乎:灣區人工智慧 AI QQ群:604562980 一線人工智慧工程師獨立兼職運營 如果本文對你有幫助,歡迎點贊,轉發 資料結構和演算法分

-manacher演算法模板

給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度.  迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S  兩組case之間由

(leetcode簡單篇四百零九題)

給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 “Aa” 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示例 1: 輸入: “abccccdd” 輸出: