NYOJ題目37 回文字串

2021-08-07 15:04:30 字數 992 閱讀 2241

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:4 描述

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

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

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

樣例輸入

1

ab3bd

樣例輸出

2

還是題目做少了,看到這個題目沒有第一時間想到求最長公共子串行(可以參考這個題:yoj題目36-最長公共子串行(經典動態規劃題))

把上面的字串反向之後,求兩個字串的最長公共子串行,然後用長度減去最長公共子串行即得答案

#include #include#include using namespace std;

int dp[1005][1005];

int main()

{ int n;

char a[1005],b[1005];

cin>>n;

while(n--)

{ scanf("%s",a);

int len = strlen(a);

for(int i=len-1,j=0;i>=0;j++,i--)

b[j]=a[i];

memset(dp,0,sizeof(dp));

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

{ for(int j=0;j<=len;j++)

{if(b[i-1]==a[j-1])

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

else

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

// cout<

題目37 回文字串

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

NYOJ 37 回文字串

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

nyoj 37 回文字串

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