給定乙個字串str,如果可以在str的任意位置新增字元,請返回在新增字元最少的情況下,讓str整體都是回文字串的一種結果。
輸入思路ab輸出
aba
採取動態規劃的方式:
dp[i][j]表示字元子區間[i=>j]構造成回文最少的新增字元數量那麼存在以下的遞推關係:
如果str[i]==str[j]那麼dp[i][j]=dp[i+1][j+1] 即如果區間首尾相等 那麼只需要考慮內部即可最終原串需要新增的最少字元數量為 dp[0][len-1]如果str[i]!=str[j] 那麼dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1) 即如果區間首尾不相等 那麼是兩個可能的子區間中取較大值+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...