打印所有可能的方法以在C ++中将一个字符串转换为另一字符串
在这个问题中,我们给了两个字符串str1和str2。 我们的任务是创建一个程序,以打印所有可能的方式将一个字符串转换为另一个字符串。
问题描述: 在这里,我们需要找到将str1转换为str2的所有可能方法。进行转换时,我们可以执行这三种操作中的任何一种,
插入
消除
代替
让我们举个例子来了解这个问题,
输入: str1=“kfeod”str2=“kfcadq”
输出结果
Way1:Insert q, after d. Replace c by e. Replace o by a.
解决方法
我们将首先找到最少的编辑数量,然后创建一个DP矩阵。然后检查两个字符串中与该元素有关的字符是否相等,然后不要修改,否则在从最后一个元素复制时进行更新。
此处,当前字符DP[i][j]=DP[i-1][j-1]。检查str1的第(i-1)个元素和str2的第(j-1)个元素是否相等,然后沿对角线穿过DP。
现在,如果str1的第(i-1)个元素和str2的第(j-1)个元素不相等。DP[i][j]的值是(DP[i-1][j-1],DP[i][j-1]和DP[i-1][j]中的最小值)+1。
此方法可以打印一种将一个字符串转换为另一字符串的方法。所有方式打印的方法都有些棘手,它使用诸如字符串向量的 高级数据结构,我们将在稍后学习。
该程序说明了我们的方法的工作原理,
示例
#include <iostream> using namespace std; int DP[100][100]; void findWays(string str1, string str2) { int len1 = str1.length(); int len2 = str2.length(); int i, j; DP[len1 + 1][len2 + 1]; for (i = 0; i <= len1; i++) DP[i][0] = i; for (j = 0; j <= len2; j++) DP[0][j] = j; for (i = 1; i <= len1; i++) { for (j = 1; j <= len2; j++) { if (str1[i - 1] == str2[j - 1]) DP[i][j] = DP[i - 1][j - 1]; else DP[i][j] = (min(min(DP[i - 1][j - 1], DP[i - 1][j]), DP[i][j - 1])) + 1; } } while (len1 and len2) { if (str1[len1 - 1] == str2[len2 - 1]) { len1--; len2--; } else if (DP[len1][len2] == DP[len1-1][len2-1] + 1) { cout<<"\nModify '"<<str1[len1-1]<<"' to '"<<str2[len2-1]; len1--; len2--; } else if (DP[len1][len2] == DP[len1-1][len2] + 1) { cout<<"\nRemove "<<str1[len1-1]<<"'"; len1--; } else if (DP[len1][len2] == DP[len1][len2-1] + 1) { cout <<"\nInsert '"<<str2[len2-1]<<"'"; len2--; } } } int main() { string str1 = "kfeodge"; string str2 = "kfcadqpe"; cout<<"将一个字符串转换为另一字符串的方法是 "; findWays(str1, str2); return 0; }输出结果
将一个字符串转换为另一字符串的方法是 Modify 'g' to 'p Insert 'q' Modify 'o' to 'a Modify 'e' to 'c