修改字符串的最小成本


介绍

在本教程中,我们使用 C++ 编程概念实现示例,以查找修改字符串的最小成本。字符串修改包括将一个字符串更改为另一个字符串的操作。字符串操作包括插入、删除和替换。我们预定义了每个操作的成本。您可以选择您选择的成本值。通过计算字符串修改的总操作成本来生成输出。

插入函数用于插入缺失的字符,删除用于删除不需要的字符,替换操作用于将一个字符替换为另一个字符。

为了实现上述任务,我们使用两种逻辑

  • 动态规划:将程序分成子部分可以减少时间和复杂度。

  • 递归函数调用:重复调用函数,直到任务完成。

演示 1

String1 = “book”
String2 = “back”
costInsertion = 1
costDeletion = 1
costSubstitution = 2

输出

4

在上面的演示中,使用 3 种不同的操作 (costInsertion、costDeletion、costSubstitution) 将 string1 修改为 string2;这些操作定义了使用每个操作的成本。插入新元素的成本为 1。删除已存在元素的成本为 1,用新元素替换元素的成本为 2。每个操作的成本都是预定义的。使用该操作,将 string1 转换为 string2 的成本为 2,其中包括将“o”替换为“a”和“o”替换为“c”。

演示 2

String1 = “abcdef”
String2 = “azced”
costInsertion = 1
costDeletion = 1
costSubstitution = 1

输出

Minimum string modification cost is 5

在上面的演示中,使用 3 种操作:插入、删除和替换将 string1 修改为 string2。每个操作的成本都是预定义的。将 string1 转换为 string2 的总成本为 5,其中包括删除“b”、“d”和“f”,插入“z”和“d”的操作。

示例中使用的 C++ 库函数

语法

length():此内置库函数在<string>头文件中定义。它以字符总数的形式返回字符串长度。

string_name.length();

vector():它在头文件中定义。它是一个动态数组,具有易于插入和删除操作。

vector<data_type> vector_name;

算法

  • 获取两个输入字符串。

  • 定义每个操作的成本。

  • 创建一个 (m+1)x (n+1) 的二维数组,其中 m 是第一个字符串的长度,n 是第二个字符串的长度。

  • 遍历输入字符串的每个字符,以检查对特定操作的需求,并根据 string2 的要求执行操作。

  • 返回字符串修改操作的最小总成本。

示例 1

我们使用递归实现了一个演示。minimumCost() 函数计算将 string1 修改为 string2 的最小成本。该函数考虑 3 种情况:当其中一个字符串为空时,使用插入/删除操作,返回它们中的最小值。

#include <iostream>
#include <algorithm>
using namespace std;

int minimumCost(string str1, string str2, int insertionCost, int deletionCost, int substitutionCost, int x, int y) 
{

    if (x == 0) 
    {
        return y * insertionCost;
    }
    if (y == 0) 
    {
        return x * deletionCost;
    }

    if (str1[x - 1] == str2[y - 1])
    {
        return minimumCost(str1, str2, insertionCost, deletionCost, substitutionCost, x - 1, y - 1);
    }

    // Recursively calculating the operation cost 
    int cd = deletionCost + minimumCost(str1, str2, insertionCost, deletionCost, substitutionCost, x - 1,
    y);
    int ci = insertionCost + minimumCost(str1, str2, insertionCost, deletionCost, substitutionCost, x, y - 1);
    int cs = substitutionCost + minimumCost(str1, str2, insertionCost, deletionCost, substitutionCost, x - 1, y - 1);

    return min({cd, ci, cs});
}

int main() {
    string str1 = "kitten";
    string str2 = "sitting";
    int insertionCost = 1;
    int deletionCost = 1;
    int substitutionCost = 2;

    int m = minimumCost(str1, str2, insertionCost, deletionCost, substitutionCost, str1.length(), str2.length());

    cout << "Minimum cost to modify the string: " << m << endl;

    return 0;
}

输出

Minimum cost to modify the string : 5

示例 2

我们使用动态规划实现了一个演示。递归方法的时间复杂度很高,对于大型输入并不实用。动态规划效率更高,因为它将问题分解成块。

创建了一个 minimumCost() 函数和数组 dp 来迭代字符串的每个字符。使用 length() 函数查找输入字符串的长度。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
//user-defined function to calculate the minimum cost
int minimumCost(string str1, string str2, int insertionCost, int deletionCost, int substitutionCost) 
{
    int a = str1.length();
    int b = str2.length();

    vector<vector<int>> dp(a + 1, vector<int>(b + 1, 0));
    for (int x = 0; x <= a; x++) 
    {
        dp[x][0] = x * deletionCost;
    }
    for (int y = 0; y <= b; y++) 
    {
        dp[0][y] = y * insertionCost;
    }


    for (int x = 1; x <= a; x++) 
    {
        for (int y = 1; y <= b; y++) 
        {
            if (str1[x - 1] == str2[y - 1]) 
            {
                dp[x][y] = dp[x - 1][y - 1];
            } 
            else 
            {
                dp[x][y] = min({dp[x - 1][y] + deletionCost,
                                dp[x][y - 1] + insertionCost,
                                dp[x - 1][y - 1] + substitutionCost});
            }
        }
    }

    // Return the minimum cost in array form
    return dp[a][b];
}

int main() 
{
    string str1 = "kitten";
    string str2 = "sitting";
    int insertionCost = 1;
    int deletionCost = 1;
    int substitutionCost = 2;

    int mc = minimumCost(str1, str2, insertionCost, deletionCost, substitutionCost);

    cout << "Minimum cost to modify the string: " << mc << endl;

    return 0;
}

输出

Minimum cost to modify the string. 5 

结论

我们完成了本教程,我们使用动态规划和递归方法实现了两个示例。要修改字符串,使用了三种不同的操作:插入、删除和替换。每个操作的成本在示例中是预定义的。

更新于: 2023年8月18日

浏览量 265

开启你的 职业生涯

完成课程获得认证

开始学习
广告