當(dāng)前位置:
首頁(yè) >
NYOJ_37_回文字符串
發(fā)布時(shí)間:2023/11/29
42
豆豆
生活随笔
收集整理的這篇文章主要介紹了
NYOJ_37_回文字符串
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先,我們把字符串反轉(zhuǎn),然后用反串和原串求最大公共子序列,再用字符串長(zhǎng)度減去最大公共子序列的長(zhǎng)度就是答案,我們還可以用滾動(dòng)數(shù)組優(yōu)化內(nèi)存
狀態(tài)轉(zhuǎn)移方程:
(i長(zhǎng)度的a串和j長(zhǎng)度的b串的最長(zhǎng)公共子序列長(zhǎng)度)
? ? ? ? ? ? ?1.dp[i-1][j-1]+1 ? ? a[i]=b[j]
dp[i][j]=
? ? ? ? ? ? ?2.max(dp[i][j-1],dp[i-1][j]) ? ? a[i]!=b[j]
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; int re[2][1005];//使用滾動(dòng)數(shù)組優(yōu)化了空間 int main() {int t,i,j;string a,b;scanf("%d",&t);while(t--){cin>>a;b=a;reverse(a.begin(),a.end());memset(re,0,sizeof(re));for(i=0;i<a.length();++i)for(j=0;j<b.length();++j){if(a[i]==b[j]){re[(i+1)&1][j+1]=re[i&1][j]+1;}else re[(i+1)&1][j+1]=re[i&1][j+1]>re[(i+1)&1][j]?re[i&1][j+1]:re[(i+1)&1][j];//條件表達(dá)式是最省時(shí)間的 }printf("%d\n",a.length()-re[(a.length())&1][b.length()]);}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/A-way/archive/2013/05/02/3054423.html
總結(jié)
以上是生活随笔為你收集整理的NYOJ_37_回文字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到针灸的针是什么意思
- 下一篇: java web 中的转发和重定向路径问