字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入: first = "pale" second = "ple" 输出: True
示例 2:
输入: first = "pales" second = "pal" 输出: False
dp[i][j]
的含义)dp[0][j]
= j;dp[0][i]
= i;class Solution { public: bool oneEditAway(string first, string second) { int n = first.size(); int m = second.size(); if(n - m > 1) return false; vector<vector<int>> dp(n + 1,vector<int>(m + 1,0)); //当第一个字符串为"" for (int j = 1; j <= m; j++) { dp[0][j] = j; } //当第二个字符串为"" for (int i = 1; i <= n; i++) { dp[i][0] = i; } for(int i = 1; i <= n;i++) { for(int j = 1; j <= m;j++) { if(first[i - 1] == second[j - 1]) dp[i][j] = dp[i - 1][j - 1]; else dp[i][j] = min({dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1}); } } int SizeMax = max(n,m); if(dp[n][m] > 1) return false; return true; } };
class Solution { public: bool oneEditAway(string first, string second) { int n = first.size(); int m = second.size(); int len = n-m; if (abs(len) > 1) return false; int count=1; for (int i = 0,j=0; i < n &&j < m; i++,j++) { if (first[i]!=second[j]) { if (len==1) //second添加一个字符 j--; else if (len==-1) //second删除一个字符 i--; count--; //编辑second的字符 } if (count<0) //大于一次编辑就失败 return false; } return true; } };