NYOJ 37 回文字串

2021-08-25 02:25:42 字數 1613 閱讀 1679

標籤:動態規劃,回文串,最長公共子串行

相似題目:

題目

所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如"aba"。當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字串。

輸入
第一行給出整數n(0 < n < 100)

接下來的n行,每行乙個字串,每個字串長度不超過1000.

輸出
每行輸出所需新增的最少字元數

輸入樣例
1

ab3bd

輸出樣例
解題思路(個人理解)
回文串就是順序讀和逆序讀是一樣的,現在有乙個字串s1,我們的目的是把s1變成乙個回文串。做法是把s1逆序後得到s2(圖1),如果s1=s2,那麼s1就是乙個回文串。

該怎麼做呢?我們往s1、s2中盡量少地新增一些字元使s1=s2,也就是讓兩者的最長公共子串行就是它們本身。注意到,s1和s2中已經存在一些公共子串行(圖2),所以最少的字元新增數等於s1字串長度減去這些公共子串行的長度。見參考**1。

圖1

圖2

圖3

參考**1
#include

#include

#define maxn 1005

char s1[maxn]

;char s2[maxn]

;int l[maxn]

[maxn]

;//l[i][j]:str1[0~i-1]和str2[0~j-1]的lcs長度

intmain()

s2[len]

='\0'

;//求lcs長度

for(

int i=

0;iprintf

("%d\n"

,len-l[len]

[len]);

}return0;

}

參考**2
#include

#include

#include

#define maxn 1005

using

namespace std;

char s[maxn]

;int dp[maxn]

[maxn]

;//dp[i][j]:從i到j構成回文串最少新增的字元數

intmain()

}printf

("%d\n"

,dp[0]

[len-1]

);}return0;

}

NYOJ 37 回文字串

思想 在紙上測試幾組資料,發現先逆轉原來的字串,再用原來的字串跟逆轉後的字串進行比較,求得的最長公共子串行就是回文串,也就是不需要新增的,再用總長度減去最長公共子串行就可以得到最少需要新增的字元數。就簡單了,以前寫過的稍稍改下就直接貼上來了。include includeint f 1001 100...

nyoj 37 回文字串

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文...

nyoj 37 回文字串

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文...