1. 程式人生 > >動態規劃演算法之尋找最長迴文數串

動態規劃演算法之尋找最長迴文數串

       給定一個字串s,你可以從中刪除一些字元,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢?

輸出需要刪除的字元個數。

本題可轉化為動態規劃演算法求解最長公共子序列問題,然後用總字串長度減去最長子序列長度,便得出問題的答案。

先將給定的初始字串S1反過來排列,設為S2,求S1和S2的最長公共子序列便可。C++程式碼如下:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int temp[100][100];

void caculate(string s1){
	string s2(s1);
	reverse(s2.begin(), s2.end());
	int len = s1.length();
	memset(temp, 0, sizeof(temp));
	for (int i = 0; i<len; ++i)
	{
		for (int j = 0; j<len; ++j)
		{
			if (s1[i] == s2[j])
				temp[i + 1][j + 1] = temp[i][j] + 1;
			else 
				temp[i + 1][j + 1] = max(temp[i][j + 1], temp[i + 1][j]);
		}
	}
	cout << len - temp[len][len] << endl;
}

int main()
{
	string s;
	getline(cin, s);
	caculate(s);
	system("pause");
	return 0;
}

程式執行結果如下:


相關推薦

動態規劃演算法尋找

       給定一個字串s,你可以從中刪除一些字元,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢? 輸出需要刪除的字元個數。 本題可轉化為動態規劃演算法求解最長公共子序列問題,然後用總字串

Longest Palindromic Substring(動態規劃尋找子序列)

求一個字串中符合迴文性質的最長子序列Example:Input: "babad" Output: "bab" Note: "aba" is also a valid answer. Example:Input: "cbbd" Output: "bb"演算法思路:一開始的

leetcode演算法題—golang—(題5)

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

LeetCode5.

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

演算法題:(C#實現)

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

manacher's algorithm尋找

manacher’s algorithm尋找最長迴文子串 #include <vector> #include <iostream> #include <string> using namespace std; strin

演算法學習:(c++)leetcode 5

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

資料結構與演算法隨筆------四種方法求解(暴力列舉+動態規劃+中心擴充套件+manacher演算法(馬拉車))

所謂迴文串,就是正著讀和倒著讀結果都一樣的迴文字串。 比如: a, aba, abccba都是迴文串, ab, abb, abca都不是迴文串。 一、暴力法 方法一:直接暴力列舉 求每一個子串時間複雜度O(N^2), 判斷子串是不是迴文O(N),兩者是相乘關係,所以時間

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

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

演算法學習——尋找字串中的

文章轉載自公眾號《網際網路偵查》 /** * @author xiaoshi on 2018/9/24. * Happy Mid-Autumn Festival */ public class PlalindromeString { // 判斷一個字串是否迴文,演算法中用

(動態規劃)

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

Leetcode中級演算法(5)C++

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: “aba” 也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 這道題在網上看到了許多解法,如動態規劃,

動態規劃 & 子序列

一、題目 所謂迴文字串,就是一個字串,從左到右讀和從右到左讀是完全一樣的,比如 “a”、“aba”、“abba”。 對於一個字串,其子串是指連續的一段子字串,而子序列是可以非連續的一段子字串。 最長迴文子串 和 最長迴文子序列(Longest Palindrom

LeetCode 5. Longest Palindromic Substring Python 四種解法(Manacher 動態規劃)

Longest Palindromic Substring 最長迴文子串 學習筆記 1. Brute method 第一種方法:直接迴圈求解,o(n2)o(n2) class Solution: def longestPalindrome(self, s):

動態規劃1.求

求字串的子串大致有四中方法,暴力,DP,中心拓展,馬拉車演算法,這篇講DP怎麼做。 DP最重要的就是要能利用到前面的結果來推斷當前狀態,比暴力優化的地方就在此,暴力需要對每一個字串做一次O(n)的操作才能判斷出結果,也就是整個過程要O(n^3),但DP對每一個字串的判斷時間是O(1),總共是O(n^2)

leetcode5. 動態規劃

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

動態規劃】求公共子

題目 : 給定兩個字串,求出它們之間連續的最長的相同子字串的長度。 eg : fbaabe,ebaabf,連續最長子串長度為4。 注意:求最長迴文子串也可以用求最長公共子串來求,只需將字串反轉作為另外一個字串,迴文部分反轉之後不變,然後求LCS(Longes

動態規劃和遞

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

【HDU - 3068】(Manacher演算法,馬拉車演算法

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

【探索-中級演算法

這一題可以參考:647. 迴文子串 本質上是一樣的,要判斷出所有的迴文字串,然後找到其中最長的那一個。 中心擴充套件法 中心擴充套件就是把給定的字串的每一個字母當做中心,向兩邊擴充套件,這樣來找最長的子迴文串。演算法複雜度為O(N^2) public Stri