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

来源:互联网 发布:fedora linux镜像下载 编辑:程序博客网 时间:2024/06/05 06:30

题目

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;        }    }};

原创粉丝点击