來源:牛客網
題目描述
然而面試官 xwc 一眼就看到了重點:大學打過 ACM!
xwc:“
聽說你很低襖?考你個題:
忽略字母大小寫,你這篇簡歷去掉最長的迴文子序列後還有多長?
”
psd 順手就把這個問題拋給了你。
輸入描述:
多組輸入,每組輸入一個長度不超過 1234 的沒空格的字符串,是 psd 的簡歷。
輸出描述:
每組輸出一個整數,如題。
這個題目看似很長,其實重要的話就兩行!
這個題的核心思想就是就最長公共子序列,輸入一個字符串然後與他的另一個逆序字符串進行對比,找出它們的最長公共子序列就OK了!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[1300][1300];
int lcs(string str1, string str2)
{
int len1 = str1.length();
int len2 = str2.length();
memset(dp,0,sizeof(dp));
for(int i = 1; i <= len1; i++)
{
for(int j = 1; j <= len2; j++)
{
if(str1[i-1] == str2[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else
{
dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
}
}
}
return dp[len1][len2];
}
int main()
{
string str1 = "abdcd";
string str2 = "baced";
while(cin>>str1)
{
int len = str1.length();
for(int i = 0; i < len; i++)
{
if(str1[i] >= 'A' && str1[i] <= 'Z')
{
str1[i] = str1[i] + 32;
}
}
str2 = str1;
int cnt = len-1;
for(int i = 0; i < len; i++)
{
str2[cnt--] = str1[i];
}
cout << len - lcs(str1,str2) << endl;
}
return 0;
}