zoukankan      html  css  js  c++  java
  • 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;
    	}
    
    }
    
    
    
  • 相关阅读:
    四个通用分页存储过程(来源于www.codeproject.com)
    C#2.0 print winform 打印窗体数据试试
    C# 2.0 Graphics 画雪人
    [转]Asp.Net 上传大文件专题(1)概述:上传大文件的难点
    [转]Asp.Net 上传大文件专题(2)页面生成流程
    [转]C# 调用sql 2000存储过程
    [转]Asp.Net 上传大文件专题
    [转]Asp.Net 上传大文件专题(3)从请求流中获取数据并保存为文件[下]
    c#中调用Ffmpeg转换视频格式的问题
    [转]Asp.Net 上传大文件专题(3)从请求流中获取数据并保存为文件[上]
  • 原文地址:https://www.cnblogs.com/izhoujie/p/13252873.html
Copyright © 2011-2022 走看看