题目描述:
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
示例 1:
输入: "sea", "eat"
输出: 2
解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"
说明:
- 给定单词的长度不超过500。
- 给定单词中的字符只含有小写字母。
思路分析:
这实际是最长公共子序列的一个变形题。注意在这类题目中,子序列是可不连续的,而子串是连续的。这里就利用dp[i][j]数组表示字符串1的0-i和字符串2的0-j之间的最长公共序列。状态转移方程为若当前所指的两个字符相等,则dp[i][j] = dp[i-1][j-1]+1,否则,dp[i][j] = max(dp[i][j-1], dp[i-1][j])。时间复杂度为O(n*m),空间复杂度为O(n*n)。
代码:
1 class Solution { 2 public: 3 int minDistance(string word1, string word2) { 4 int len1 = word1.length(); 5 int len2 = word2.length(); 6 vector<vector<int>> dp(len1+1, vector<int>(len2+1, 0)); 7 for(int i=0; i<=len1; i++) 8 { 9 for(int j=0; j<=len2; j++) 10 { 11 if(i==0 || j==0) 12 { 13 dp[i][j]=0; 14 continue; 15 } 16 if(word1[i-1]==word2[j-1]) 17 { 18 dp[i][j] = dp[i-1][j-1]+1; 19 } 20 else 21 { 22 dp[i][j] = max(dp[i-1][j], dp[i][j-1]); 23 } 24 } 25 } 26 return (len1+len2-2*dp[len1][len2]); 27 } 28 };