字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = "pale"
second = "ple"
输出: True
示例 2:
输入:
first = "pales"
second = "pal"
输出: False
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/one-away-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
见注释即可。
class Solution { public boolean oneEditAway(String first, String second) { // 先对长度进行判断,很容易可以想到,如果两者长度相差长度大于1,则必定不符合要求,直接返回false即可。 // 继续进行判断,发现长度符合的情况下又可以分成两种: // 1. 给长度更低的那一个字符串添加一个字符。可以先同时从两个字符串的开头进行遍历。遇到不等的情况下给长度较低的那个字符串添加一个字符,然后接着遍历。再次遇到不等的情况,意味着不符合要求。 // 2. 两者的长度相等,此时直接判断两个字符串是否只有小于等于一个的字符不同,利用一个指针同时遍历,利用一个额外的布尔类型判断是否已经进行更改过即可。 int len1 = first.length(); int len2 = second.length(); // 长度相等, if (len1 == len2) { return updateBoolean(first, second); } else if (len1 > len2) { if (len1 - len2 > 1) { return false; } else { return insertBoolean(second, first); } } else { if (len2 - len1 > 1) { return false; } else { return insertBoolean(first, second); } } } // 给长度较小的字符串添加字符 private boolean insertBoolean(String first, String second) { int p1 = 0; int p2 = 0; // 判断之前是否已经进行过插入操作。 boolean ju = false; while (p1 < first.length() && p2 < second.length()) { if (first.charAt(p1) != second.charAt(p2)) { if (ju) { return false; } else { p2 ++; ju = true; } } else { p1 ++; p2 ++; } } return true; } // 长度相等的情况。 private boolean updateBoolean(String first, String second) { // 判断之前是否已经进行过更新操作。 boolean ju = false; int p1 = 0; int p2 = 0; for (int i = 0; i < first.length(); i ++) { if (first.charAt(i) != second.charAt(i)) { if (ju) { return false; } else { ju = true; } } } return true; } }