構造回文 新增字元

2021-10-13 15:25:13 字數 1290 閱讀 5699

給定乙個字串str,如果可以在str的任意位置新增字元,請返回在新增字元最少的情況下,讓str整體都是回文字串的一種結果。

輸入

ab輸出

aba

思路

採取動態規劃的方式:

dp[i][j]表示字元子區間[i=>j]構造成回文最少的新增字元數量

那麼存在以下的遞推關係:

如果str[i]==str[j]那麼dp[i][j]=dp[i+1][j+1] 即如果區間首尾相等 那麼只需要考慮內部即可

如果str[i]!=str[j] 那麼dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1) 即如果區間首尾不相等 那麼是兩個可能的子區間中取較大值+1

最終原串需要新增的最少字元數量為 dp[0][len-1]

那麼進一步需要求解構造成回文的子串,其思路為:

可以知道最終回文串長度為len2=len+dp[0][len-1]

初始化l=0 r=len2-1 i=0 j=len-1

如果dp[i][j]=dp[i+1][j]+1 那麼是在i+1=>j基礎上新增了字元str[i] 那麼最終串s[l++]=str[i] s[r–]=str[i++]

如果dp[i][j]=dp[i][j-1] 那麼是在i=>j-1基礎上新增了字元str[j] 那麼最終串s[r–]=str[j] s[i++]=s[j–]

否則 s[r–]=str[j–] s[l++]=str[i++]

注意由於新增構成了回文,首尾都需要新增

**實現

#include#include#include#includeusing namespace std;

int main()

else

} }

//int len2=len+dp[0][len-1];//最終的長度=原先長度+至少需要新增長度

char s[len2];

int l=0,r=len2-1; //新串控制指標

int i=0,j=len-1; //老串控制指標

while(l<=r && i<=j)

else if(dp[i][j]==dp[i+1][j]+1)

else if(str[i]==str[j]) //如果首尾串相等

}for(int i=0;icout<}

構造回文串

給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。輸入描述 輸入資料有多組,每組包含乙個字串s,且保證 1 s.length 1000.輸出描述 對於每組資料,輸出乙個整數,代表最少需要刪除的字元個數。輸入例子 abcda goo...

構造回文 最長回文子串

題目 給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。1 s.length 1000。輸入 abcda google 輸出 2 2思路 我本沒有思路 回文串的特點是正著讀和反著讀一樣,假設原來字串是s,求它的反串,然後再找到它們...

程式設計題 構造回文

給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。輸入描述 輸入資料有多組,每組包含乙個字串s,且保證 1 s.length 1000.輸出描述 對於每組資料,輸出乙個整數,代表最少需要刪除的字元個數。輸入例子 abcda goo...