zoukankan      html  css  js  c++  java
  • 161. One Edit Distance

    https://leetcode.com/problems/one-edit-distance/#/description

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

    Sol: 

    In computational linguistics and computer scienceedit distance is a way of quantifying how dissimilar two strings (e.g., words) are to one another by counting the minimum number of operations required to transform one string into the other. 

    If s and t are one distance away then no matter it is insert or delete or replace the count of common characters must be max(m, n) - 1, where m is the length of sand n is the length of t. It is easy to see that the reverse is also true.

    Assume the length of common prefix (from left to right) is i and the length of common suffix after i (from right to left) is j, the answer is then max(m, n) - 1 == i + j

    Example 1 (1 replace)

    s = "abcdefg", m = 7
    t = "abcxefg", n = 7 
    i = 3, j = 3
    max(m, n) - 1 == i + j is true
    

    Example 2 (0 edit)

    s = "abcdefg", m = 7
    t = "abcdefg", n = 7 
    i = 7, j = 0
    max(m, n) - 1 == i + j is false
    

    Example 3 (1 insert)

    s = "abcdefg", m = 7
    t = "abcefg", n = 6 
    i = 3, j = 3
    max(m, n) - 1 == i + j is true
    

    Example 4 (1 delete 1 insert)

    s = "abcdefg", m = 7
    t = "abcefgh", n = 7 
    i = 3, j = 0
    max(m, n) - 1 == i + j is false
    

    The method is O(m+n) since any character is visited at most once.

     

    class Solution(object):
        def isOneEditDistance(self, s, t):
            """
            :type s: str
            :type t: str
            :rtype: bool
            """
            
            if abs(len(s) - len(t)) > 1:
                return False
            min_len = min(len(s), len(t))
            
            left = right = 0
            
            while left < min_len and s[left] == t[left]:
                left += 1
            
            while right < min_len - left and s[~right] == t[~right]:
                right += 1
            
            return max(len(s), len(t)) - (left + right) == 1
            

    Note: 

    1 The usage of ~ in Python string operation. 

    ex. a= [1,2,3,4,5,6]

    i = 1

    a[i] =  2

    a[~i] = 5

    Sol 2:

    class Solution(object):
        def isOneEditDistance(self, s, t):
            """
            :type s: str
            :type t: str
            :rtype: bool
            """
            
            if len(s) > len(t):
                return self.isOneEditDistance(t,s)
            
            if abs(len(s) - len(t)) > 1 or s == t:
                return False
            
            for i in range(len(s)):
                if s[i] != t[i]:
                    # check replacement or deletion operation
                    return s[i+1:] == t[i+1:] or s[i:] == t[i+1:]
            return True
            
  • 相关阅读:
    iOS 10 因苹果健康导致闪退 crash-b
    iOS10 配置须知-b
    iOS开发 适配iOS10以及Xcode8-b
    iOS 10 的适配问题-b
    mybatis中分页查询
    mybatis开发流程,增删改查
    spring mvc接收参数方式,json格式返回请求数据
    xml配置文件中常见的命名空间解释
    myeclipse中配置schemaLocation路径,实现xml文件自动提示
    spring MVC工作流程
  • 原文地址:https://www.cnblogs.com/prmlab/p/7126037.html
Copyright © 2011-2022 走看看