字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。
给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
输入:
first = “pale”
second = “ple”
输出: True
思路:动态规划
参看carl的编辑距离
建立dp数组dp[i][j],表示以下标i - 1为结尾的字符串first,和以下标j - 1为结尾的字符串second,最近编辑距离为dp[i][j]。
下图可以解释,first[i - 1] == second[j - 1]的判断为何而来。这就是在对比两个字符串的某个字符是否相等呀~
class Solution {
public:
bool oneEditAway(string first, string second) {
if( first == second )
return true;
int m=first.size(), n=second.size();
vector<vector<int>> dp( m+1, vector<int>( n+1, 0 ) );
for( int i=1; i<=m; i++ ){
dp[i][0]=i;
}
for( int j=1; j<=n; j++ ){
dp[0][j]=j;
}
for( int i=1; i<=m; i++ ){
for( int j=1; j<=n; j++ ){
if( first[i-1]==second[j-1] ) //如果相同,编辑距离和上次的相同
dp[i][j]=dp[i-1][j-1];
else{ //否则,取增加,删除,替换三种操作的最少次数加1,这里删除和增加操作等效
dp[i][j]=min( {dp[i-1][j], dp[i][j-1], dp[i-1][j-1]} ) + 1;
}
}
}
return dp[m][n]==1;
}
};