面试题 01.05.一次编辑
题目描述
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例1
输入:
first = “pale”
second = “ple”
输出: True
示例2
输入:
first = “pales”
second = “pal”
输出: False
提示
- 检查每一个条件
- “插入字符”选项和“删除字符”不分开检查
- 一次完成三次检查
示例代码
Java DP(距离)
public class Question01_05 {
public static void main(String[] args) {
Solution s = new Solution();
String first1 = "pale",second1 = "ple";
System.out.println(s.oneEditAway(first1, second1));
String first2 = "pales",second2 = "pal";
System.out.println(s.oneEditAway(first2, second2));
}
}
class Solution{
public boolean oneEditAway(String first, String second) {
int m = first.length(), n = second.length();
int[][] dp = new int[m + 1][n + 1];
for (int i = 0; i <= m; i++)
dp[i][0] = i;
for (int j = 0; j <= n; j++)
dp[0][j] = j;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (first.charAt(i - 1) == second.charAt(j - 1))
dp[i][j] = dp[i - 1][j - 1];
else
dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
}
}
return dp[m][n] <= 1;
}
}
Java 提交结果
执行用时:9 ms, 在所有 Java 提交中击败了6.37% 的用户
内存消耗:38.1 MB, 在所有 Java 提交中击败了97.62% 的用户
示例代码
Java 一次遍历
public class Question01_05 {
public static void main(String[] args) {
Solution s = new Solution();
String first1 = "pale",second1 = "ple";
System.out.println(s.oneEditAway(first1, second1));
String first2 = "pales",second2 = "pal";
System.out.println(s.oneEditAway(first2, second2));
}
}
class Solution{
public boolean oneEditAway(String first,String second) {
if(first.length() > second.length())
return Edit(first, second);
else
return Edit(second, first);
}
public static boolean Edit(String f,String s) {
int l1 = f.length(),l2 = s.length();
if(l1 - l2 > 1)
return false;
for(int i = 0;i < l2;i++) {
if(f.charAt(i)!=s.charAt(i))
return f.substring(i + 1).equals(s.substring(l1 == l2 ? i + 1 : i));
}
return true;
}
}
Java 提交结果
执行用时:2 ms, 在所有 Java 提交中击败了97.91% 的用户
内存消耗:38.2 MB, 在所有 Java 提交中击败了90.16% 的用户