一次编辑~

字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。
给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。

输入:
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;

    }
};
上一篇:Codeforces Round #733 (Div. 1 + Div. 2, based on VK Cup 2021 - Elimination (Engine))


下一篇:LeetCode刷题笔记第19题:删除链表的倒数第 N 个结点