Description
有一个长度为N的字符串S和长度为M的字符串T。
可以对串S进行以下三种操作:
1.在其第一个字母前面插入任意一个字母
2.在其最后一个字母后面插入任意一个字母
3.删除其第一个字母
进行尽量少的操作使得S串变成T串
1<=N,M<=10000
输入格式输入有两行,第一行为字符串S,第二行为字符串T,字符串只包含字母
输出格式输出一个数字,表示将S变为T的最小操作数。
输入样例cababab
aababab
输出样例2
提示透过现象看本质
样例解释:最优的方法是先进行一次操作3,将cababab变为ababab,再进行一次操作1,将ababab变为aababab,进行了两次操作。
|
哥们想得太复杂了,舍友说是最长字段和问题,朋友说是编辑距离问题,我搜了一下都要用到动态规划矩阵啥的😅都是我不熟悉的地方。于是我自己瞎想勉强写了出来。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include <iostream>//C++
#include <string>
#include <algorithm>
using namespace std;
#include<stack>
#include<malloc.h>
#include<stdio.h>
#include<map>
#define OK 1
#define ERROR 0
int main()
{
char bg[10005];//被改
char mb[10005];//目标
gets(bg);
gets(mb);
int cnt1=0,cnt2=0;
//在目标中找被改
char *mbzbg=strstr(mb,bg);
int mbsize=strlen(mb);
int bgsize=strlen(bg);
if(mbzbg)
{
cout<<mbsize-bgsize<<endl;//e.g. 123 12345
return 0;
}
char *first=strstr(mb,bg);
while(!first)
{
bgsize=strlen(bg);
for(int i=0;i<bgsize-1;i++)
bg[i]=bg[i+1];
bg[bgsize-1]='\0';
first=strstr(mb,bg);
cnt1++;
}
bgsize=strlen(bg);
cout<<cnt1+mbsize-bgsize;
return 0;
}
我一开始脑子抽了,以为最后一位数也可以删除,于是写了以下一段冗长的代码,比较从前删除和从后删除的情况所需步骤最后再输出较小者,思路没问题,诸君敬请见证:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include <iostream>//C++
#include <string>
#include <algorithm>
using namespace std;
#include<stack>
#include<malloc.h>
#include<stdio.h>
#include<map>
#define OK 1
#define ERROR 0
int main()
{
char bg[10005];
char mb[10005];
gets(bg);
gets(mb);
int cnt1=0,cnt2=0;
//在目标中找被改
char *mbzbg=strstr(mb,bg);
int mbsize=strlen(mb);
int bgsize=strlen(bg);
if(mbzbg)
{
cout<<mbsize-bgsize<<endl;//123 12345
return 0;
}
//在被改中找目标
char *bgzmb=strstr(bg,mb);
if(bgzmb)
{
cout<<bgsize-mbsize<<endl;//aabcc bc
return 0;
}
char *first=strstr(mb,bg);
char bg1[100];
strcpy(bg1,bg);
while(!first)
{
bgsize=strlen(bg);
for(int i=0;i<bgsize-1;i++)
bg[i]=bg[i+1];
bg[bgsize-1]='\0';
first=strstr(mb,bg);
cnt1++;
}
bgsize=strlen(bg);
int bgsize1=strlen(bg1);
char *last=strstr(mb,bg1);
while(!last)
{
bgsize1=strlen(bg1);
bg1[bgsize1-1]='\0';
last=strstr(mb,bg1);
cnt2++;
}
bgsize1=strlen(bg1);
cout<<min(cnt1+mbsize-bgsize,cnt2+mbsize-bgsize1);
return 0;
}