zoukankan      html  css  js  c++  java
  • 字符转换

    题意:

    给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。

    你总共三种操作方法:

    • 插入一个字符
    • 删除一个字符
    • 替换一个字符

    分析:

     如果想具体看什么时候

    • 插入一个字符
    • 删除一个字符
    • 替换一个字符

    是不可行的,因为情况很复杂,你很难去做判断。

    所以就用动态规划来解决,考虑在当前情况,三种操作都比较得出最小操作次数即可

    dp[i][j]表示word1的前i个字符转为word2的前j个字符的最少操作次数。那么状态转移方程就是

    if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1];       
    	//分别对应修改(使a[i] == b[j]),增(加在i后面增加一个和b[j]相等),删除(删除a[i]) 
    	else dp[i][j] = min(min(dp[i-1][j-1] + 1,dp[i][j-1] + 1),dp[i-1][j] + 1);
    

      

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int work(string a,string b)
    {
    	int la = a.length(),lb = b.length();
    	
    	int dp[la + 1][lb + 1];
    	
    	dp[0][0] = 0; 
    	for(int i = 1;i <= lb;i++)
    	dp[0][i] = i;
    	
    	for(int j = 1;j <= la;j++)
    	dp[j][0] = j;
    	
    	for(int i = 1;i <= la;i++)
    	for(int j = 1;j <= lb;j++)
    	if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1];       
    	//分别对应修改(使a[i] == b[j]),增(加在i后面增加一个和b[j]相等),删除(删除a[i]) 
    	else dp[i][j] = min(min(dp[i-1][j-1] + 1,dp[i][j-1] + 1),dp[i-1][j] + 1);
    	
    	return dp[la][lb];
    } 
    
    int main()
    {
    	string a,b;
    	while(cin >> a >> b)
    	{
    		cout << work(a,b) << endl;
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    CSS基础学习(二)
    CSS基础学习(一)
    《人月神话》读后感(第五六章)
    Python基础学习
    团队项目介绍
    全国疫情数据可视化展示(详细介绍)
    《人月神话》读后感(第三四章)
    拓展欧几里德
    Siano
    操作系统内存大页(THP)对redis性能的影响
  • 原文地址:https://www.cnblogs.com/mch5201314/p/11922215.html
Copyright © 2011-2022 走看看