华为机试---动态规划---优化编辑器问题

版权声明:本文为优快云博主「wskyp」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u014226012/article/details/65937179

问题描述
Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。
Ex:
字符串A:abcdefg
字符串B: abcdef
通过增加或是删掉字符”g”的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。
要求:
给定任意两个字符串,写出一个算法计算它们的编辑距离。

解题思路
问题抽象:将A变为B所需的最少操作步数(也可以是B变为A的最少操作步数,两个角度一样。因为A变为B如果有插入的话,对应B变为A就可以等价为删除;A变为B为替换的话,B变为A也可等价位替换;A变为B为删除的话,B变为A等价为插入,因为步数都一样)。用dp[x][y]表示A的前x个字符转换为B的前y个字符所需要的最少操作步数
最优子结构:A的前x个字符变为B的前y个字符所需要的最少操作步数d[x][y]取决于子问题:

1)A的最后一位参与变换:
if(A的第x个字符不等于B的第y个字符)dp[x][y]=dp[x-1][y-1]+1 //将A的前x-1个字符变为B的前y-1个字符, 然后将最后一个字符替换成B的最后一个字符(一步)
else dp[x][y]=dp[x-1][y-1] //如果A的最后一个字符等于B的最后一个字符,则A的前x个字符变为B的前y个字符等价于将A的前x-1个字符变为B的前y-1个字符
2)A的最后一位不参与变换(删除掉A的最后一位)
dp[x][y]=dp[x-1][y]+1 //将A的前x-1个字符变为B,然后将最后一个字符删除
3)B的最后一位不参与变化(删除掉B的最后一位)
dp[x][y]=dp[x][y-1]+1 //将B的前y-1个字符变为A,然后将最后一个字符删除

dp[x][y]=min{dp[x-1][y-1]+1或dp[x-1][y-1],dp[x-1][y]+1,dp[x][y-1]+1}

当x=0时,即A为空字符串,则A变为B的前Y个字符所需的操作为y,dp[0][y]=y;
同理,y=0时,dp[x][0]=x;
这样自底向上就能求出将A变为B最少的操作步数dp[a.length][b.length].

动态规划的关键一步就是如何就将问题与子问题联系起来,即将问题i想办法用问题i-1表示

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
#define mp make_pair
#define pb push_back
#define fi first
#define se second

int dp[1005][1005];

int main()
{
    string s1,s2;
    while(cin >> s1 >> s2){
        int len1 = s1.size();
        int len2 = s2.size();
        memset(dp,inf,sizeof(dp));
        for(int i = 0;i <= len1;++i){
            dp[i][0] = i;
        }
        for(int i = 0;i <= len2;++i){
            dp[0][i] = i;
        }
        for(int i = 1;i <= len1;++i){
            for(int j = 1;j <= len2;++j){
                if(s1[i - 1] != s2[j - 1]){
                    dp[i][j] = min(dp[i][j],dp[i - 1][j - 1] + 1);
                }else{
                    dp[i][j] = min(dp[i][j],dp[i - 1][j - 1]);
                }
                dp[i][j] = min(dp[i][j],dp[i - 1][j] + 1);
                dp[i][j] = min(dp[i][j],dp[i][j - 1] + 1);
            }
        }
        cout << dp[len1][len2] << endl;
    }
    return 0;
}
<think>好的,用户想要在一周内快速掌握Linux,需要制定一个高效的学习路径。首先得确定用户的基础和目标。用户提到“一周速成”,可能时间紧迫,可能用于面或项目需求。需要参考提供的引用内容,尤其是引用[1]和[2],里面提到了推荐的课程和书籍,还有视频资源。 首先,用户可能需要基础的系统知识,比如安装、基本命令、权限管理等。引用[1]推荐了黑马程序员的Linux课程,适合零基础,应该作为入门。然后,引用[2]里韦东山的视频课程分为ARM实验、驱动开发等,但用户可能暂时不需要驱动开发,除非有特定需求。不过用户想速成,可能应用开发更关键。 接下来,需要分解每天的学习任务。第一天安装系统和基础命令,第二天权限和用户管理,第三天软件包管理和服务配置,第四天Shell脚本,第五天网络配置和SSH,第六天开发环境搭建,第七天项目实战。这样结构比较清晰,逐步深入。 同时,用户可能需要实际操作的练习,比如虚拟安装、常用命令操作、脚本编写等。结合引用[3]提到的华为OD知识点,可能需要强调实战练习,比如Shell脚本和自动化任务,这对开发有帮助。 需要注意,一周时间有限,重点应放在常用命令、系统管理、Shell脚本和开发环境搭建上,而不是深入内核或驱动开发。引用中的书籍可能作为后续深入学习资料,但速成阶段以视频和实操为主。 最后,生成相关问题时要覆盖用户可能进一步的需求,比如性能优化、Shell脚本调、安全加固等,帮助他们后续学习。确保推荐资源来自引用中的课程和书籍,保持相关性。</think>### Linux一周速成学习路径(应用开发方向) ### 第一天:基础环境搭建 1. 安装Linux系统(推荐Ubuntu虚拟- 使用VMware/VirtualBox快速部署 - 掌握$sudo apt update$等基础命令 2. 核心命令行操作 - 文件系统操作:$ls, cd, cp, mv, rm$ - 文本编辑器:vim/nano基础操作 - 系统状态查看:$top, ps, df -h$[^1] ### 第二天:系统管理基础 1. 用户与权限管理 - $chmod, chown, useradd$命令 - 理解`rwx`权限体系 2. 软件包管理 - apt/yum包管理器 - 安装开发工具链:$sudo apt install build-essential$ ### 第三天:Shell编程入门 1. 编写第一个Shell脚本 ```bash #!/bin/bash echo "当前时间: $(date)" echo "系统负载: $(uptime)" ``` 2. 掌握流程控制 - if条件判断 - for/while循环 - 函数定义 ### 第四天:开发环境配置 1. C/C++开发环境 - 安装gcc/g++编译器 - 使用Makefile构建项目 2. Python环境配置 - 安装python3/pip - 配置虚拟环境:$python3 -m venv myenv$ ### 第五天:系统编程基础 1. 文件IO操作 - 掌握open/read/write系统调用 - 理解文件描述符概念 2. 进程管理 - fork()函数使用 - 进程间通信基础(管道/信号) ### 第六天:网络编程入门 1. 基础网络命令 - $ping, netstat, curl$使用 - 防火墙配置:$ufw allow 22$ 2. Socket编程基础 - TCP/UDP通信模型 - 简单客户端/服务端实现 ### 第七天:项目实战 1. 自动化部署脚本 - 结合crontab实现定时任务 - 日志分析脚本编写 2. Web服务部署 - 使用Nginx搭建静态网站 - 配置Python Flask/Django服务 ### 推荐学习资源 1. 视频课程:黑马程序员《Linux零基础快速入门到精通》 2. 工具书:《鸟哥的Linux私房菜-基础学习篇》 3. 实战项目:GitHub开源项目`linux-command`(常用命令速查)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值