One Edit Distance

要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator)

  • 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录mismatch个数,err:0,err:1,有一位mismatch,这时候再if/else分replace or ins,err:2:return False

    • https://repl.it/CquW
    • 错误点:index回移的logic:短的回移,因为每步必向前,所以相当于短的不动,长的动
  • 未知长度:因为两个string之间char的差异最多1,所以state可以用三个变量表示:replace,ins_a,ins_b。
    • 程序结构就是loop在外,然后if/else(if就是直接判断replace/ins_a/ins_b),注意这里不是按cur_a==cur_b区分。而是三个变量都是False,那么直接比较cur_a/cur_b,否则有一个True,那么就需要错位比较,然后重新把三个变量中,另外如果这个分支上再三个都是False,那说明选不可能了,return False而不是继续下一个循环。
    • 循环之后?分三种情况(a多,b多 or 一样)。a多,可以是没有diff(这样多出的一个是insert的),or 有diff但是错位一直相同并且到了终点。
    • 注意最后err可能在最后,类似merge,要考虑a.hasNext or b.hasNext
    • https://repl.it/CsNV
    • 错误点:
      • 如果相同返回False,所以最后相同长度的case只能是replace为True
      • 这题要用到loop的末值i,而python的loop最后的i值不是过界的,所以要用while loop
# Given two strings S and T, determine if they are both one edit distance apart.

# Hide Company Tags Snapchat Uber Facebook Twitter
# Hide Tags String
# Hide Similar Problems (H) Edit Distance

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

        error = 0
        i,j = 0, 0
        ns, nt = len(s), len(t)
        while i<ns and j<nt:
            if s[i]!=t[j]:
                error+=1
                if error>1:
                    return False

                if ns>nt:
                    j-=1 # error: should be j-=1
                elif ns<nt:
                    i-=1
            i+=1
            j+=1

        return error==1 or (error==0 and ns!=nt)

sol = Solution()
assert sol.isOneEditDistance("ab","cab")==True
# Given two strings S and T, determine if they are both one edit distance apart.

# Hide Company Tags Snapchat Uber Facebook Twitter
# Hide Tags String
# Hide Similar Problems (H) Edit Distance

class Solution(object):
    def isOneEditDistance(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        ns, nt = len(s), len(t)
        if abs(ns-nt)>1:
            return False

        diff, replace, ins_s, ins_t = False, False, False, False
        pre = -1
        i=0
        while i<len(s) and i<len(t):
            if not replace and not ins_s and not ins_t:
                if s[i]!=t[i]:
                    diff=replace=ins_s=ins_t=True
            else:
                if ins_s and t[i]!=s[pre]: ins_s=False
                if ins_t and s[i]!=t[pre]: ins_t=False
                if replace and t[i]!=s[i]: replace=False
                if not (ins_s or ins_t or replace): return False
            pre = i
            i+=1

        if i<len(t):
            return not diff or ((t[i]==s[pre] and ins_s) and i+1==len(t))
        elif i<len(s):
            return not diff or ((s[i]==t[pre] and ins_t) and i+1==len(s))
        else:
            return replace

sol = Solution()
assert sol.isOneEditDistance("c", "c")==False
assert sol.isOneEditDistance("a", "ba")==True
         

边工作边刷题:70天一遍leetcode: day 71-2的更多相关文章

  1. 边工作边刷题:70天一遍leetcode: day 71

    Longest Substring with At Most Two Distinct Characters # Given a string, find the length of the long ...

  2. 边工作边刷题:70天一遍leetcode: day 89

    Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...

  3. 边工作边刷题:70天一遍leetcode: day 77

    Paint House I/II 要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost https://repl.it/Chw ...

  4. 边工作边刷题:70天一遍leetcode: day 78

    Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 g ...

  5. 边工作边刷题:70天一遍leetcode: day 85-3

    Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...

  6. 边工作边刷题:70天一遍leetcode: day 101

    dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...

  7. 边工作边刷题:70天一遍leetcode: day 1

    (今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted ...

  8. 边工作边刷题:70天一遍leetcode: day 70

    Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...

  9. 边工作边刷题:70天一遍leetcode: day 71-3

    Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...

随机推荐

  1. ASP.NET MVC进阶一

    一.控制器相关 在Controller类中方法访问级别为public的方法,就是行为(Action). 如果不希望Controller类中的方法成为Action(可以在地址栏中被访问),有两种实现方式 ...

  2. gcd和拓展gcd算法

    gcd算法是用来求两个数最大公约数的算法,他是依靠辗转相除(中国好像叫辗转相减)法来求两个数的最大公约数,别的地方也有很多介绍不做过多赘述,主要提供代码供自己参考. gcd(int a,int b) ...

  3. git 上传项目到github

    1.本地新建文件夹GIT,Git Bash打开命令窗口, ①git config --global user.name "名字"  eg:  git config --global ...

  4. [git] ignore文件规则失效

    背景 在某次项目,发现已经将.iml规则写进.ignore文件,但是对.iml的修改依然会出现在changelist中. 解决方案 先引用git官网上的描述 gitignore - Specifies ...

  5. Telegram传奇:俄罗斯富豪、黑客高手、极权和阴谋…

    说了很久要写Telegram的故事,一直拖延没有写.在我拖延的这段时间里面,Telegarm继续快速增长,前几天,在旧金山的TechCrunch Disrupt活动上,创始人Durov说现在Teleg ...

  6. HTML5中的canvas基本概念及绘图

    * Canvas(画布) * 基本内容 * 简单来说,HTML5提供的新元素<canvas> * Canvas在HTML页面提供画布的功能 * 在画布中绘制各种图形 * Canvas绘制的 ...

  7. 关于iChartjs在移动端提示框tip显示不正常的解决方法

    最近项目需要使用手机图表,但是找了很久都没找到专门为移动端开发的图表,只能找一些能兼容移动端的图表控件,今天就讲讲关于iChartjs这个图形库的一点问题. 问题 iChartjs的提示框tip的显示 ...

  8. db2死锁分析与处理

    在数据库中,锁的主要功能是为了控制并发数据的完整性而引入的机制,在并发应用中出现锁现象并不可怕,锁现象通常分为死锁和锁等待两种情形. 死锁是因为两个并发的进程或者线程同时各自占有一个资源,又需要占有对 ...

  9. sap透明表、结构、簇介绍以及查找表方法

    sap透明表.结构.簇介绍以及查找表方法 一些人在写开发功能说明书的时候不知道如何去找屏幕字段对应的透明表,下面我来介绍一个比较有效的方法:首先简单介绍一下概念:在SAP中的表的种类有以下三种:Tra ...

  10. android学习笔记 activity生命周期&任务栈&activity启动模式

    activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...