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

leetcode最長迴文字串_動態規劃

1、問題描述

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

示例:

輸入: "babad"

輸出: "bab"

注意: "aba"也是有效答案

2、問題解析

使用dp[i][j]代表從i到j最長的迴文字串的長度

如果一個字串的首尾字元相同,並且中間的部分也是迴文字串(dp[i+1][j-1]==j-i+1)那麼它也是迴文字串

這時候dp[i][j]=dp[i+1][j-1]+2;

如果不是兩個字元不相同或者中間部分不是迴文字串的話,那麼就在它的兩個子串(dp[i+1][j],dp[i][j-1])中選擇較大的那個。

3、問題記錄

期間犯了三個錯誤:

1)沒考慮字串長度為0的情況,並且初始化最大長度biggest應該為1

2)迴文字串的判斷有問題:一開始只考慮了首尾兩字元相等,沒有考慮剩餘的子串也需要是迴文字串

3)只有dp[i][j]大於biggest的時候,才能更新biggest和begin的值

4、程式碼:

class Solution {
public:
	string longestPalindrome(string s) {
		int len = s.length();
		if (len == 0)return "";
		int i, j;
		vector<vector<int>> dp(len, vector<int>(len));//dp[i][j]代表從i到j最長的迴文字串長度
		int biggest=1, begin=0;
		for (i = 0; i < len; ++i) {
			dp[i][i] = 1;
		}
		for (i = len - 2; i >=0; --i) {
			for (j = i + 1; j < len; ++j) {
				if (s[j] == s[i]&&(j-i-1)==dp[i+1][j-1]) {//如果首尾兩字元相同並且剩餘字元長度是最大回文長度,可以判斷是迴文字串
					dp[i][j] = dp[i + 1][j - 1] + 2;
					if(dp[i][j]>biggest){//始終記錄最大的長度和起始位置
						biggest= dp[i][j];
						begin = i;
					}
				}
				else {
					dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
				}
			}
		}
		return s.substr(begin, biggest);
	}
};

相關推薦

leetcode字串_動態規劃

1、問題描述給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 長度最長為1000。示例:輸入: "babad" 輸出: "bab" 注意: "aba"也是有效答案2、問題解析使用dp[i][j]代表從i到j最長的迴文字串的長度如果一個字串的首尾字元相同,並且中

LeetCode 字串檢測

寫了兩個方法,一個7000ms多一個5000ms多,比較菜,看了最厲害的50ms的程式碼,直接寫幾萬個字串做字典查詢,學不來學不來。。。。。。 import numpy as np class Solution: def longestPalindrome2(self, s):

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

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

夕拾演算法進階篇:16)子串(動態規劃DP)

給出一個字串S,求S的最長迴文子串的長度。 樣例:字串“PATZJUJZTACCBCC”的迴文子串為“ATZJUJZTA”,長度為9。 如果使用暴力解法,列舉子串的兩個端點i和j,時間複雜度需要O(n^2)。判斷子串是否為迴文需要O(n),總體時間複雜度為O(n^3),使用

leetcode-中級演算法-陣列和字串-字串

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

C語言實現求一個字串字串 動態規劃

求解思路: 迴文字串的子串也是迴文,比如P[i,j](表示以i開始以j結束的子串)是迴文字串, 那麼P[i+1,j-1]也是迴文字串。這樣最長迴文子串就能分解成一系列子問題了。 這樣需要額外的空間O(

LeetCode:Longest Palindromic Substring(字串)

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: "b

leetcode第五題—字串

string longestPalindrome(string &s) { int n=s.size(); if(n==0) return " "; string longest=s.substr(0,1); for(int i=0;i<n-1;i++) { //cente

轉載-----Java Longest Palindromic Substring(字串)

轉載地址:https://www.cnblogs.com/clnchanpin/p/6880322.html 假設一個字串從左向右寫和從右向左寫是一樣的,這種字串就叫做palindromic string。如aba,或者abba。本題是這種,給定輸入一個字串。要求輸出一個子串,使得子串是最長的padromi

求出 字串 JAVA版本【給出編碼思想-適用於任何語言】

目的:在任意的字串中求出最長的迴文字串   思路:(適用於任何語言)   1、判斷當前給定的字串是否是相同的字串(也就是所有字元都相同),如果是直接返回了。   2、如果第一步沒有返回,就以非第一個字元為軸,分別求出以它為軸的,雙數迴文字串,

Leetcode---子串--普通解

這裡寫的是普通解法,演算法時間複雜度為O(n^2) 這裡我僅僅是為了督促自己每天刷一道演算法題,並不是為了寫出每道題的最優解,在此之前,我僅僅是將Leetcode基礎題刷了一遍。 首先丟擲思路,長為n的字串共有n^2個子串,而判斷一個迴文串的方法是設立頭尾指標,從兩邊向中間

PAT (Advanced Level) Practice 1040 Longest Symmetric String (25 分) 字串 dp

#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn=

Python求字串(三重迴圈遍歷所有字串 新)

前兩天自己寫了下,雖然對了,但是思路不太好,網上看了遍歷的思路,瞬間感覺之前好蠢,雖然本質上我的程式碼也是遍歷,但是思路不好。 正確思路就是先遍歷出所有長度大於等於2的字串,然後在逐一判斷這些字串是不是迴文字串就行了,思路清晰了,程式碼就簡單多了,10分鐘就寫完了。 d

leetcode-子串-JAVA

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

leetcode- 子串

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

字串演算法-Manacher’s Algorithm-馬拉車演算法

除了翻譯之外,其中還加入了個人的理解的部分,將其中沒有詳細說明的部分進行了解釋。 時間複雜度為O(n)的演算法 首先,我們需要講輸入的字串 S 進行一下轉換得到 T,轉換的方法就是通過在每兩個字元之間插入一個字串“#”,你馬上就能知道為什麼要這麼做。

字串-Java實現

一、問題描述 迴文字串定義:如果一個字串正著讀和反著讀是一樣的,那它就是迴文串例如:aba 、 abcba 。  要求:  給出一個字串:asdsaasa  返回一個最長的迴文字串:asdsa 二、解法(迴文字串為奇數) public class Test {

字串(Mancher演算法)

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

字串字串

  方法1:暴力搜尋方法, 2個迴圈遍歷 方法2: 動態規劃,dp[i][j] ,每次要記錄一下最長的開始的位置和長度 class Solution { public: bool ispaline(string str){ int start=0;

字串--MANACHER演算法

個人感覺馬拉車演算法的思想和擴充套件KMP的思想是相似的。 首先對於這個問題,我們可以暴力列舉每個子串,然後判斷是否是迴文串,時間複雜度大概是O(n^3),我們運用下尺取法的思想,列舉每一個對稱軸位置(針對長度的奇偶有所區別),那麼時間複雜度會是O(n^2),接著我們如果把