字符串有三種編輯操做:插入一個字符、刪除一個字符或者替換一個字符。 給定兩個字符串,編寫一個函數斷定它們是否只須要一次(或者零次)編輯。git
示例 1:github
輸入: first = "pale" second = "ple" 輸出: True
示例 2:面試
輸入: first = "pales" second = "pal" 輸出: False
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/one-away-lcci
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。算法
由於只有一次編輯機會,因此使用一個boolean變量來表示這個機會,固然若是是屢次機會,那麼就得換用int變量了;
步驟:網絡
算法複雜度:函數
由於只有一次機會,那麼:ui
算法複雜度:code
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; } }