学什么可以做视频网站网站开发设计的技术路线
学什么可以做视频网站,网站开发设计的技术路线,建筑网下载,建设的比较好的档案馆网站文章目录 一、583、两个字符串的删除操作二、72、编辑距离三、完整代码 所有的LeetCode题解索引#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、583、两个字符串的删除操作 思路分析#xff1a;本题的思路和115、不同的子序列差不多#xff0c;只是变成… 文章目录 一、583、两个字符串的删除操作二、72、编辑距离三、完整代码 所有的LeetCode题解索引可以看这篇文章——【算法和数据结构】LeetCode题解。 一、583、两个字符串的删除操作 思路分析本题的思路和115、不同的子序列差不多只是变成了两个字符串都能删除字符。
第一步动态数组的含义。 d p [ i ] [ j ] dp[i][j] dp[i][j]代表使得 w o r d 1 [ 0 , i − 1 ] word1[0, i-1] word1[0,i−1]和 w r o d 2 [ 0 , j − 1 ] wrod2[0, j-1] wrod2[0,j−1]相等所需删除的最小步数。第二步递推公式。 d p [ i ] [ j ] dp[i][j] dp[i][j]可以由两种情况推导出来 w o r d 1 [ i − 1 ] word1[i - 1] word1[i−1]与 w o r d 2 [ j − 1 ] word2[j - 1] word2[j−1]相同那么最小步数和使得 w o r d 1 [ 0 , i − 2 ] word1[0, i-2] word1[0,i−2]和 w r o d 2 [ 0 , j − 2 ] wrod2[0, j-2] wrod2[0,j−2]相等所需删除的最小步数相同。 d p [ i ] [ j ] d p [ i − 1 ] [ j − 1 ] dp[i][j] dp[i-1][j-1] dp[i][j]dp[i−1][j−1]。 w o r d 1 [ i − 1 ] word1[i - 1] word1[i−1]与 w o r d 2 [ j − 1 ] word2[j - 1] word2[j−1]不相同这种情况的 d p [ i ] [ j ] dp[i][j] dp[i][j]可以由三部分构成若 w o r d 1 [ 0 , i − 2 ] word1[0, i - 2] word1[0,i−2]和 w o r d 2 [ 0 , j − 1 ] word2[0, j - 1] word2[0,j−1]做了 d p [ i − 1 ] [ j ] dp[i - 1][j] dp[i−1][j]次删除操作以后会相等那么再删除 w o r d 1 [ i − 1 ] word1[i - 1] word1[i−1]以后又可以相等即 d p [ i ] [ j ] d p [ i − 1 ] [ j ] 1 dp[i][j] dp[i - 1][j] 1 dp[i][j]dp[i−1][j]1若 w o r d 1 [ 0 , i − 1 ] word1[0, i - 1] word1[0,i−1]和 w o r d 2 [ 0 , j − 2 ] word2[0, j - 2] word2[0,j−2]做了 d p [ i ] [ j − 1 ] dp[i][j - 1] dp[i][j−1]次删除操作以后会相等那么再删除 w o r d 2 [ j − 1 ] word2[j - 1] word2[j−1]以后又可以相等即 d p [ i ] [ j ] d p [ i ] [ j − 1 ] 1 dp[i][j] dp[i][j - 1] 1 dp[i][j]dp[i][j−1]1。因为要求最小步数那么我们对两项取最小 d p [ i ] [ j ] m i n ( d p [ i − 1 ] [ j ] 1 , d p [ i ] [ j − 1 ] 1 ) dp[i][j] min(dp[i - 1][j] 1, dp[i][j - 1] 1) dp[i][j]min(dp[i−1][j]1,dp[i][j−1]1)。 if (word1[i - 1] word2[j - 1]) dp[i][j] dp[i - 1][j - 1];else dp[i][j] min(dp[i - 1][j], dp[i][j - 1]) 1;第三步元素初始化。 d p [ i ] [ 0 ] dp[i][0] dp[i][0]第一列表示字符串 w o r d 1 [ 0 , i − 1 ] word1[0, i-1] word1[0,i−1]变成空字符串需要删除的最小字符个数。 d p [ 0 ] [ j ] dp[0][j] dp[0][j]第一行表示 w o r d 2 [ 0 , j − 1 ] word2[0, j-1] word2[0,j−1]变成空字符串需要删除的最小字符个数。其中空字符串word1变成空字符串word2的个数为0。那么 d p [ 0 ] [ 0 ] 0 , d p [ i ] [ 0 ] i , d p [ 0 ] [ j ] j dp[0][0]0, dp[i][0] i, dp[0][j] j dp[0][0]0,dp[i][0]i,dp[0][j]j。 for (int i 1; i word1.size(); i) dp[i][0] i; // 第一列初始化为ifor (int j 1; j word2.size(); j) dp[0][j] j; // 第一行初始化为i第四步递归顺序。一共有两层循环从前往后进行遍历。第五步打印结果。 程序如下
// 583、两个字符串的删除操作-动态规划
class Solution {
public:int minDistance(string word1, string word2) {vectorvectoruint64_t dp(word1.size() 1, vectoruint64_t(word2.size() 1, 0)); // dp[0][0]为0for (int i 1; i word1.size(); i) dp[i][0] i; // 第一列初始化为ifor (int j 1; j word2.size(); j) dp[0][j] j; // 第一行初始化为ifor (int i 1; i word1.size(); i) {for (int j 1; j word2.size(); j) {if (word1[i - 1] word2[j - 1]) dp[i][j] dp[i - 1][j - 1];else dp[i][j] min(dp[i - 1][j], dp[i][j - 1]) 1;}}return dp[word1.size()][word2.size()];}
};复杂度分析
时间复杂度 O ( n ∗ m ) O(n*m) O(n∗m) n n n和 m m m分别是两个字符串的长度。空间复杂度 O ( n ∗ m ) O(n*m) O(n∗m)。
二、72、编辑距离 思路分析本题在583题的基础之上加入了插入和替换操作。我们同样用动态规划的方法分析。
第一步动态数组的含义。 d p [ i ] [ j ] dp[i][j] dp[i][j]代表使得 w o r d 1 [ 0 , i − 1 ] word1[0, i-1] word1[0,i−1]和 w r o d 2 [ 0 , j − 1 ] wrod2[0, j-1] wrod2[0,j−1]相等所需的最小操作数。第二步递推公式。 d p [ i ] [ j ] dp[i][j] dp[i][j]可以由两种情况推导出来 w o r d 1 [ i − 1 ] word1[i - 1] word1[i−1]与 w o r d 2 [ j − 1 ] word2[j - 1] word2[j−1]相同那么最小操作数和使得 w o r d 1 [ 0 , i − 2 ] word1[0, i-2] word1[0,i−2]和 w r o d 2 [ 0 , j − 2 ] wrod2[0, j-2] wrod2[0,j−2]相等所需的最小操作数相同。 d p [ i ] [ j ] d p [ i − 1 ] [ j − 1 ] dp[i][j] dp[i-1][j-1] dp[i][j]dp[i−1][j−1]。 w o r d 1 [ i − 1 ] word1[i - 1] word1[i−1]与 w o r d 2 [ j − 1 ] word2[j - 1] word2[j−1]不相同这种情况的 d p [ i ] [ j ] dp[i][j] dp[i][j]可以由三部分构成增加、删除和替换。删除部分和583题一致 d p [ i ] [ j ] m i n ( d p [ i − 1 ] [ j ] 1 , d p [ i ] [ j − 1 ] 1 ) dp[i][j] min(dp[i - 1][j] 1, dp[i][j - 1] 1) dp[i][j]min(dp[i−1][j]1,dp[i][j−1]1)。而增加字符和删除的操作数没有区别。若 w o r d 1 [ 0 , i − 2 ] word1[0, i - 2] word1[0,i−2]和 w o r d 2 [ 0 , j − 2 ] word2[0, j - 2] word2[0,j−2]做了 d p [ i − 1 ] [ j − 1 ] dp[i - 1][j - 1] dp[i−1][j−1]次删除操作以后会相等那么再替换 w o r d 1 [ i − 1 ] word1[i - 1] word1[i−1]或者 w o r d 2 [ j − 1 ] word2[j - 1] word2[j−1]之间任意一个元素以后又可以相等即 d p [ i ] [ j ] d p [ i − 1 ] [ j − 1 ] 1 dp[i][j] dp[i - 1][j - 1] 1 dp[i][j]dp[i−1][j−1]1。因为要求最小操作数那么我们对两项取最小 d p [ i ] [ j ] m i n ( d p [ i − 1 ] [ j ] 1 , d p [ i ] [ j − 1 ] 1 , d p [ i − 1 ] [ j − 1 ] 1 ) m i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] , d p [ i − 1 ] [ j − 1 ] ) 1 dp[i][j] min(dp[i - 1][j] 1, dp[i][j - 1] 1, dp[i - 1][j - 1] 1) min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) 1 dp[i][j]min(dp[i−1][j]1,dp[i][j−1]1,dp[i−1][j−1]1)min(dp[i−1][j],dp[i][j−1],dp[i−1][j−1])1。 if (word1[i - 1] word2[j - 1]) dp[i][j] dp[i - 1][j - 1];//else dp[i][j] min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) 1; // min()函数只接受两个参数或者数组else dp[i][j] min({ dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] }) 1;第三步元素初始化。 d p [ i ] [ 0 ] dp[i][0] dp[i][0]第一列表示字符串 w o r d 1 [ 0 , i − 1 ] word1[0, i-1] word1[0,i−1]变成空字符串需要的最少操作数。 d p [ 0 ] [ j ] dp[0][j] dp[0][j]第一行表示 w o r d 2 [ 0 , j − 1 ] word2[0, j-1] word2[0,j−1]变成空字符串需要的最少操作数。其中空字符串word1变成空字符串word2的个数为0。那么 d p [ 0 ] [ 0 ] 0 , d p [ i ] [ 0 ] i , d p [ 0 ] [ j ] j dp[0][0]0, dp[i][0] i, dp[0][j] j dp[0][0]0,dp[i][0]i,dp[0][j]j。 for (int i 1; i word1.size(); i) dp[i][0] i; // 第一列初始化为ifor (int j 1; j word2.size(); j) dp[0][j] j; // 第一行初始化为i第四步递归顺序。一共有两层循环从前往后进行遍历。第五步打印结果。 程序如下
// 72、编辑距离-动态规划
class Solution2 {
public:int minDistance(string word1, string word2) {vectorvectorint dp(word1.size() 1, vectorint(word2.size() 1, 0)); // dp[0][0]为0for (int i 1; i word1.size(); i) dp[i][0] i; // 第一列初始化为ifor (int j 1; j word2.size(); j) dp[0][j] j; // 第一行初始化为ifor (int i 1; i word1.size(); i) {for (int j 1; j word2.size(); j) {if (word1[i - 1] word2[j - 1]) dp[i][j] dp[i - 1][j - 1];//else dp[i][j] min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) 1; // min()函数只接受两个参数或者数组else dp[i][j] min({ dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] }) 1;}}return dp[word1.size()][word2.size()];}
};复杂度分析
时间复杂度 O ( n ∗ m ) O(n*m) O(n∗m) n n n和 m m m分别是两个字符串的长度。空间复杂度 O ( n ∗ m ) O(n*m) O(n∗m)。
三、完整代码
# include iostream
# include vector
# include string
using namespace std;// 583、两个字符串的删除操作-动态规划
class Solution {
public:int minDistance(string word1, string word2) {vectorvectoruint64_t dp(word1.size() 1, vectoruint64_t(word2.size() 1, 0)); // dp[0][0]为0for (int i 1; i word1.size(); i) dp[i][0] i; // 第一列初始化为ifor (int j 1; j word2.size(); j) dp[0][j] j; // 第一行初始化为ifor (int i 1; i word1.size(); i) {for (int j 1; j word2.size(); j) {if (word1[i - 1] word2[j - 1]) dp[i][j] dp[i - 1][j - 1];else dp[i][j] min(dp[i - 1][j], dp[i][j - 1]) 1;}}return dp[word1.size()][word2.size()];}
};// 72、编辑距离-动态规划
class Solution2 {
public:int minDistance(string word1, string word2) {vectorvectorint dp(word1.size() 1, vectorint(word2.size() 1, 0)); // dp[0][0]为0for (int i 1; i word1.size(); i) dp[i][0] i; // 第一列初始化为ifor (int j 1; j word2.size(); j) dp[0][j] j; // 第一行初始化为ifor (int i 1; i word1.size(); i) {for (int j 1; j word2.size(); j) {if (word1[i - 1] word2[j - 1]) dp[i][j] dp[i - 1][j - 1];//else dp[i][j] min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) 1; // min()函数只接受两个参数或者数组else dp[i][j] min({ dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] }) 1;}}return dp[word1.size()][word2.size()];}
};int main() {//string word1 sea, word2 eat; // 测试案例//Solution s1;//int result s1.minDistance(word1, word2);string word1 horse, word2 ros; // 测试案例Solution2 s1;int result s1.minDistance(word1, word2);cout result endl;system(pause);return 0;
}end
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88144.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!