题目:
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = "pale"
second = "ple"
输出: True
示例 2:
输入:
first = "pales"
second = "pal"
输出: False
分析:
我们可以利用编辑距离那道题的做法LeetCode 72. Edit Distance 编辑距离 (C++/Java),但实际上这道题只要求判断能否只需要一次编辑即可,我们可以设置两个指针同时遍历两个字符串,当出现不同时记录变化次数,当次数大于1时,返回false即可。
程序:
class Solution { public boolean oneEditAway(String first, String second) { int l1 = first.length(); int l2 = second.length(); dp = new int[l1+1][l2+1]; for(int i = 0; i < dp.length; ++i){ for(int j = 0; j < dp[i].length; ++j){ dp[i][j] = -1; } } if(minDistance(first, second, l1, l2) > 1) return false; return true; } private int minDistance(String word1, String word2, int l1, int l2){ if(l1 == 0) return l2; if(l2 == 0) return l1; if(dp[l1][l2] >= 0) return dp[l1][l2]; int res = 0; if(word1.charAt(l1-1) == word2.charAt(l2-1)){ res = minDistance(word1, word2, l1-1, l2-1); }else{ res = Math.min(minDistance(word1, word2, l1-1, l2), Math.min(minDistance(word1, word2, l1, l2-1), minDistance(word1, word2, l1-1, l2-1))) + 1; } dp[l1][l2] = res; return res; } private int[][] dp; }
class Solution { public boolean oneEditAway(String first, String second) { int fl = first.length(); int sl = second.length(); if(Math.abs(fl - sl) > 1) return false; char[] arr1 = first.toCharArray(); char[] arr2 = second.toCharArray(); int i = 0; int j = 0; int count = 0; while(i < fl && j < sl){ if(arr1[i] == arr2[j]){ i++; j++; }else{ if(i + 1 < fl && arr1[i+1] == arr2[j]) i++; else if(j + 1 < sl && arr1[i] == arr2[j+1]) j++; else{ i++; j++; } count++; } if(count > 1) return false; } return count + (fl-i) + (sl-j) > 1 ? false : true; } }