1276:編輯距離

 

【題目描述】

設A和B是兩個字符串。我們要用最少的字符操作次數,將字符串A轉換爲字符串B。這裏所說的字符操作共有三種:

1、刪除一個字符;

2、插入一個字符;

3、將一個字符改爲另一個字符。

對任意的兩個字符串A和B,計算出將字符串A變換爲字符串B所用的最少字符操作次數。

【輸入】

第一行爲字符串A;第二行爲字符串B;字符串A和B的長度均小於2000。

【輸出】

只有一個正整數,爲最少字符操作次數。

【輸入樣例】

sfdqxbw
gfdgw

【輸出樣例】

4
// Created on 2020/2/22

/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int idata=2000+5;
const int inf=0x3f3f3f3f;
int n,m,t;
int minn=INT_MAX,maxx=INT_MIN;
int sumfee[idata][idata];
//兩字符串長度爲i,j:sumfee[i][j]爲最少操作數
char ch1[idata],ch2[idata];
string str1,str2;
int len1,len2;
int i,v,j,k;

inline void initial()
{
    len1=str1.length();
    len2=str2.length();

    for(i=0;i<len1;i++)
        ch1[i+1]=str1[i];
    for(i=0;i<len2;i++)
        ch2[i+1]=str2[i];

    for(i=1;i<=len1;i++)
        sumfee[i][0]=i;
    for(i=1;i<=len2;i++)
        sumfee[0][i]=i;

    return ;
}

int main()
{
    cin>>str1>>str2;

    initial();

    for(i=1;i<=len1;i++)
    {
        for(j=1;j<=len2;j++)
        {
            if(ch1[i]==ch2[j])
                sumfee[i][j]=sumfee[i-1][j-1];
            else
                sumfee[i][j]=min(min(sumfee[i-1][j],sumfee[i][j-1]),sumfee[i-1][j-1])+1;
        }
    }

    cout<<sumfee[len1][len2]<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章