回文字串

2021-09-09 02:30:40 字數 1326 閱讀 1668

時間限制:

3000

ms  |  記憶體限制:

65535kb

難度:4

描寫敘述

所謂回文字串。就是乙個字串,從左到右讀和從右到左讀是全然一樣的,比方"aba"。當然,我們給你的問題不會再簡單到推斷乙個字串是不是回文字串。

如今要求你,給你乙個字串。可在任何位置加入字元,最少再加入幾個字元,能夠使這個字串成為回文字串。輸入

第一行給出整數n(0

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

輸出每行輸出所需加入的最少字元數

例子輸入

1ab3bd

例子輸出

2題解:

輸入字串後。逆序,然後求原串與逆序串的最長公共子串行,問題是怎麼確定這樣是正確的呢?

證明:s=a1a2a3..an;s'=a1'a2'a3'...a'(n+m); s'包括s。且

s'是回文串

,求最小的m,

s'的性質:

1.最短,

2回文。3原串

的順序不變。

設 在 s'

卻不在s

中的元素記為集合

a, a'i=a'(n+m-i+1) 

假如屬於

a,那麼性質一就不滿足,所以

a'i和

a'(n+m-i+1)

中要麼都不屬於

a。要麼有乙個屬於

a,這樣找出最小屬於

a的、就是找到原串的最大配對。即原序和逆序的最長公共子串行。

程式**:

#include 

#include 

#include 

int dp[1003][1003];

char s[1003];

int main()

int n;

scanf("%d",&n);

getchar();

while(n--)

scanf("%s",s);

int len=strlen(s);

for(int i=1;i<=len;i++)

for(int j=len;j>=1;j--)

int k=len-j+1;

if(s[i-1]==s[j-1])

dp[i][k]=dp[i-1][k-1]+1;

else

dp[i][k]=dp[i][k-1]>dp[i-1][k]?dp[i][k-1]:dp[i-1][k];

printf("%d\n",len-dp[len][len]);

system("pause");

return 0;

回文字串

描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在 要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字串。輸入第一行給出整數n 0思路分析 1.判斷字串前後倆個字元...

回文字串

還是在龐果網 看到的題目,這次選了個簡單的,回文字串。題目內容 回文字串是指從左到右和從右到左相同的字串,現給定乙個僅由小寫字母組成的字串,你可以把它的字母重新排列,以形成不同的回文字串。思路 不滿足上面條件的直接返回0,因為這樣構不成回文 判斷出能形成回文以後,將元素減半,在字串一半的長度內進行組...

回文字串

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