当前位置: 首页 > article >正文

【算法】One Away LCCI 一次编辑

文章目录

  • One Away LCCI 一次编辑
    • 问题描述:
    • 分析
    • 代码
  • Tag

One Away LCCI 一次编辑

问题描述:

有2个字符串s1,s2,对于字符串有3种操作,插入,删除,修改。
现在要判断这2个字符串s1,s2,是否可以通过一次编辑或者0次,达到相等。

分析

要达到相等,首先长度就不能相差>1.
如果原来2个字符串就equal,可以直接返回。
到此,2个字符串长度相差<=1,并且不相等。
使用cnt作为编辑的计数,如果i和j分别是2个字符串的指针。
1 s1[i]==s2[j],说明2个字符相等,同时后移1位。

2 s1[i]!=s2[j],说明字符不相等,必然要进行编辑,但是有3种,insert,del,update,如果2个字符串长度一样即n==m,那么就只能选择update,cnt+=1。
如果n!=m,那么较短的一侧可以选择增加一位用来匹配,然后2者后移,cnt+=1。当然也可以选择较长的减少一位,cnt+=1。
假设较长字符串longer,较短字符串shorter,
假设i是shorter的指针,j是longer的指针,并且n!=m,那么增加较短的字符串,i就保持不变,j++,如果是删除j位置的字符,i不变,j++
最后遍历完成后,cnt<=1说明true。

其实如果满足一次编辑,在n!=m的情况下,比然要满足,longer中的位置 p,0p-1与shorter的0p-1相等,即前缀一样,并且在 shorter[pn]==longer[p+1m],即后缀一样。

代码

时间复杂度 O(N ),空间复杂度 O(1)

public boolean oneEditAway(String a, String b) {
        int n = a.length(), m = b.length();
        if (Math.abs(n - m) > 1) return false;
        if (n > m) return oneEditAway(b, a);
        int i = 0, j = 0, cnt = 0;
        while (i < n && j < m && cnt <= 1) {
            char c1 = a.charAt(i), c2 = b.charAt(j);
            if (c1 == c2) {
                i++; j++;
            } else {
                if (n == m) {
                    i++; j++; cnt++;
                } else {
                    j++; cnt++;
                }
            }
        }
        return cnt <= 1;
    }

代码是抄 宫水 大佬的,写的太优雅。

Tag

双指针


http://www.kler.cn/a/13468.html

相关文章:

  • 内网穿透工具frp原理和使用教程
  • linux_信号-终端按键信号-硬件异常信号-kill函数-raise函数-abort函数
  • 怎么将太大的word文档压缩变小,3个高效方法
  • 认识软件测试
  • iOS Matter 操作证书签发方案
  • go 语言中 struct 中 json 是代表什么意思
  • IPWorks VoIP 2022 Crack
  • 在OLED上显示各种各样的数据(文字、字母、图片)
  • PWM控制直流电机
  • 【FPGA实验1】FPGA点灯工程师养成记
  • 什么是BASE最终一致性
  • 高压放大器应用之无损检测
  • ASRock Z690 Extreme WiFi 6E i7 13700KF电脑 Hackintosh 黑苹果efi引导文件
  • 用python获取当前目录下的创建时间超过3天的所有python文件
  • 靶机精讲:BNE0x03Simple
  • 月收入过万是什么水平?在90年代可是“万人户”
  • Docker容器部署
  • 微信为什么使用 SQLite 保存聊天记录
  • Java线程基础知识
  • Hive msck 描述