1133 - 回文字符串
时间限制:3秒 内存限制:128兆
题目描述
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
输入第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000.
输出每行输出所需添加的最少字符数
样例输入
1
Ab3bd
样例输出
2
将原字符串反转,求原字符串与反转字符串的最长公共子序列长度,再用总长度减去就是结果
注意:最长公共子串(要求连续)和最长公共子序列是不同的
#include<iostream>
#include<cstring>
using namespace std;
int c[1003][1003];
int f(int len,char a[],char b[])
{
int i,j;
for(i=1;i<=len;i++)
{
for(j=1;j<=len;j++)
{
if(a[i-1]==b[j-1])
c[i][j]=c[i-1][j-1]+1;
else
c[i][j]=max(c[i-1][j],c[i][j-1]);
}
}
return c[len][len];
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(c,0,sizeof(c));
char a[1003],b[1003];
int len,i;
scanf("%s",a);
len=strlen(a);
for(i=0;i<len;i++)
b[i]=a[len-i-1];
b[len]='\0';
printf("%d\n",len-f(len,a,b));
}
}
最长公共子串:
摘自第八届蓝桥杯题目6
标题:最大公共子串
最大公共子串长度问题就是:
求两个串的所有子串中能够匹配上的最大长度是多少。
比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。
下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。
#include <stdio.h>
#include <string.h>
#define N 256
int f(const char* s1, const char* s2)
{
int a[N][N];
int len1=strlen(s1);
int len2=strlen(s2);
int i,j;
memset(a,0,sizeof(int)*N*N);
int max = 0;
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(s1[i-1]==s2[j-1])
{
a[i][j]=a[i-1][j-1]+1;
if(a[i][j]>max)
max=a[i][j];
}
}
}
return max;
}
int main()
{
printf("%d\n", f("abcdkkk", "baabcdadabc"));
return 0;
}