• LeetCode 面试题 01.05. 一次编辑


    我的LeetCode:https://leetcode-cn.com/u/ituring/

    我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii

    LeetCode

    题目

    字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。

    示例 1:

    输入: 
    first = "pale"
    second = "ple"
    输出: True
    

    示例 2:

    输入: 
    first = "pales"
    second = "pal"
    输出: False
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/one-away-lcci
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解题思路

    思路1-记录是否编辑过

    因为只有一次编辑机会,所以使用一个boolean变量来表示这个机会,当然如果是多次机会,那么就得换用int变量了;
    步骤:

    1. 逐个对比;
    2. 首次发现不等,则按如下处理并将boolean机会置false;
      • 若前者较长,那么给后者加1长度;
      • 若后者较长,那么给前者加1长度;
      • 长度相等,无处理;
    3. 再次遇到不等直接返回false,或无不等返回true;

    算法复杂度:

    • 时间复杂度: $ {color{Magenta}{Omicronleft(n ight)}} $
    • 空间复杂度: $ {color{Magenta}{Omicronleft(1 ight)}} $

    思路2-两侧夹逼校验最终不等部分长度差

    因为只有一次机会,那么:

    1. 从头到尾对比并记录位置;
    2. 从尾到头对比并记录位置;
    3. 校验步骤1和2中各自对应的位置差值,必须小于2;

    算法复杂度:

    • 时间复杂度: $ {color{Magenta}{Omicronleft(n ight)}} $
    • 空间复杂度: $ {color{Magenta}{Omicronleft(1 ight)}} $

    算法源码示例

    package leetcode;
    
    /**
     * @author ZhouJie
     * @date 2020-7-6 0:31:36 
     * @Description: 面试题 01.05. 一次编辑
     *
     */
    public class LeetCode_Satine_01_05 {
    	/**
    	 * @author: ZhouJie
    	 * @date: 2020-7-6 0:32:45 
    	 * @param: @param first
    	 * @param: @param second
    	 * @param: @return
    	 * @return: boolean
    	 * @Description: 1-记录是否编辑过;
    	 *
    	 */
    	public boolean oneEditAway_1(String first, String second) {
    		if (first == null && second == null) {
    			return true;
    		}
    		int len1 = first.length();
    		int len2 = second.length();
    		int t = len1 - len2;
    		if (t > 1 || t < -1) {
    			return false;
    		}
    		int i = 0, j = 0;
    		// 只有一次机会
    		boolean onceChance = true;
    		while (i < len1 && j < len2) {
    			if (first.charAt(i) != second.charAt(j)) {
    				if (onceChance) {
    					// first较长
    					if (t == 1) {
    						j--;
    						// second较长
    					} else if (t == -1) {
    						i--;
    					}
    					onceChance = !onceChance;
    				} else {
    					return onceChance;
    				}
    			}
    			i++;
    			j++;
    		}
    		return true;
    	}
    
    	/**
    	 * @author: ZhouJie
    	 * @date: 2020-7-6 1:51:04 
    	 * @param: @param first
    	 * @param: @param second
    	 * @param: @return
    	 * @return: boolean
    	 * @Description: 2-两侧夹逼校验最终不等部分长度差;
    	 *
    	 */
    	public boolean oneEditAway_2(String first, String second) {
    		if (first == null && second == null) {
    			return true;
    		}
    		int len1 = first.length();
    		int len2 = second.length();
    		int t = len1 - len2;
    		if (t > 1 || t < -1) {
    			return false;
    		}
    		int k = 0;
    		while (k < len1 && k < len2 && first.charAt(k) == second.charAt(k)) {
    			k++;
    		}
    		len1--;
    		len2--;
    		while (len1 >= k && len2 >= k && first.charAt(len1) == second.charAt(len2)) {
    			len1--;
    			len2--;
    		}
    		return (len1 - k) < 1 && (len2 - k) < 1;
    	}
    
    }
    
    
    
  • 相关阅读:
    Ocelot一款.NET下的API网关介绍
    【Core】.NET Core 部署( Docker + CentOS)
    VS2019添加git源代码管理
    sql两个表组合到一起,字符串拼接后放在最后一列上
    sqlserver取随机数随机取数
    delphi时间戳(10位)
    消息 7356,级别 16,状态 1,第 1 行 链接服务器 "downloadschoolcardinfo" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 为列提供的元数据不一致。对象 ""VIEW_ZJK"."V_QDXQHIS_RYXX"" 的列 "XZZ" (编译时序号为 9)在编译时有 1 的 "LENGTH",但在运行时有 2。
    sqlserver简单的组合串
    Delphi提示:List Index out Of bounds(5)
    SQLserver简单的竖向转横向
  • 原文地址:https://www.cnblogs.com/izhoujie/p/13252873.html
Copyright © 2020-2023  润新知