[Leetcode] 161. One Edit Distance 解题报告

题目

Given two strings S and T, determine if they are both one edit distance apart.

思路

One Edit Distance意味着一个字符串s可以通过删除,增加或者修改其中的一个字符变成另外一个字符串t。因此我们可以根据s和t的长度分别处理:如果两者长度相同,则判断s和t是否仅仅有一个字符不相同;如果t的长度比s长1,那么我们就同时从s和t的头部开始扫描,直到遇到第一个不相同的字符,假设此时不相同字符的索引是index,然后我们判断s[index]和t[index + 1]是否相等,直到index到达s的尾部(s的长度比t大1的情况可以对偶进行处理)。如果s和t的长度差大于1,那么一定不是One Edit Distance的,所以直接返回false即可。算法的时间复杂度是O(n),空间复杂度是O(1)。

代码

class Solution {
public:
    bool isOneEditDistance(string s, string t) {
        if (s.length() == t.length()) {
            return isModidyOneEditDistance(s, t);
        }
        else if (s.length() + 1 == t.length()) {
            return isAddOneEditDistance(s, t);
        }
        else if (t.length() + 1 == s.length()) {
            return isAddOneEditDistance(t, s);
        }
        else {
            return false;
        }
    }
private:
    bool isModidyOneEditDistance(const string &s, const string &t) {    // s and t has the same length
        int difference = 0;
        for (int i = 0; i < s.length(); ++i) {
            if (s[i] != t[i]) {
                ++difference;
            }
        }
        return difference == 1;
    }
    bool isAddOneEditDistance(const string &s, const string &t) {       // s and t has difference lengths
        int diff_index = 0;                                             // we assume t is 1 longer than s
        for (; diff_index < s.length(); ++diff_index) {
            if (s[diff_index] != t[diff_index]) {
                break;
            }
        }
        if (diff_index == s.length()) {
            return true;
        }
        else {
            for (; diff_index + 1 < t.length(); ++diff_index) {
                if (s[diff_index] != t[diff_index + 1]) {
                    return false;
                }
            }
            return true;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值