时间限制:20000ms
单点时限:1000ms
内存限制:256MB
-
nwlrb rclwnb
样例输出
-
6
描述
我们说两个字符串是非常相似的,当且仅当它们的编辑距离小于等于1.
现在我们有两个字符串A和B, 每个单位时间你可以交换字符串A的相邻的两个字符.
问最少需要多少时间,你可以让A和B变得非常相似?保证存在一种这样的方案.
输入
第一行一个字符串,表示A.
第二行一个字符串,表示B.
所有字符串都仅有英文小写字母组成.
A和B的长度都不超过100.
输出
一行表示最少需要的时间.
题目链接:http://hihocoder.com/problemset/problem/1264
题目分析:编辑距离就是增删该的次数数据范围很小,对B枚举进行增删改的操作得到C,然后在A中找C对应位置的字符,然后交换记录次数
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const INF = 0x3fffffff;
char a[105], b[105], c[105], aa[105];
int lena, lenb;
int cal()
{
memcpy(a, aa, sizeof(aa));
int res = 0;
int len = strlen(c);
if(len != lena)
return INF;
int i = 0, j = 0;
while(j != len)
{
int edi = -1;
for(int ii = i; ii < lena; ii++)
{
if(a[ii] == c[j])
{
edi = ii;
break;
}
}
if(edi == -1)
return INF;
for(int k = edi; k > i; k--)
{
swap(a[k], a[k - 1]);
res ++;
}
i ++;
j ++;
}
return res;
}
int main()
{
int ans = 100000;
scanf("%s %s", a, b);
memcpy(aa, a, sizeof(a));
lena = strlen(a);
lenb = strlen(b);
if(strcmp(a, b) == 0)
printf("0\n");
else
{
//增
for(int i = 0; i <= lenb; i++)
{
for(char j = 'a'; j <= 'z'; j++)
{
memcpy(c, b, sizeof(b));
for(int k = lenb; k > i; k--)
c[k] = c[k - 1];
c[i] = j;
ans = min(ans, cal());
}
}
//改
memcpy(c, b, sizeof(b));
for(int i = 0; i < lenb; i++)
{
for(char j = 'a'; j <= 'z'; j++)
{
char tmp = c[i];
c[i] = j;
ans = min(ans, cal());
c[i] = tmp;
}
}
//删
for(int i = 0; i < lenb; i++)
{
memcpy(c, b, sizeof(b));
for(int k = i; k < lenb - 1; k++)
c[k] = c[k + 1];
c[lenb - 1] = '\0';
ans = min(ans, cal());
}
printf("%d\n", ans);
}
}