面试题 04.02.一次编辑-----两种解法

题目表述

字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。

示例:

输入:

first = "pale"
second = "ple"
输出: True

双指针

  • 替换:替换的前提当然是两个字符串的长度相等即 m=n,如果 first 和 second 有且仅有一个字符不同则说明可以通过替换得到;
  • 插入:插入的前提是 n−m=1 ,如果 second 比 first 多一个字符,其余字符都相同则说明可以通过插入一个字符得到;
  • 删除:删除的前提是 m−n=1 ,如果 first 比 second 多一个字符,其余字符都相同则说明可以通过删除一个字符得到。
class Solution { public boolean oneEditAway(String first, String second) { if(Math.abs(first.length() - second.length()) > 1) return false; int m = first.length(); int n = second.length(); if(m == n){ int l = 0; int res = 0; while(l < m){ if(first.charAt(l) != second.charAt(l)){ res++; } l++; } return res <=1; } int res = 0; if(m > n){ res = edit(first, second); }else{ res = edit(second, first); } return res <=1; } public int edit(String first, String second){ int l = 0; int r = 0; int res = 0; while(l < first.length() && r < second.length()){ if(first.charAt(l) != second.charAt(r)){ l++; res++; continue; } r++; l++; } return res; } }

动态规划

动态规划解法和72.编辑距离解决方法一致

class Solution { public boolean oneEditAway(String first, String second) { if(Math.abs(first.length() - second.length()) > 1) return false; int m = first.length(); int n = second.length(); int[][] dp = new int[m + 1][n + 1]; for(int i = 1;i < n;i++){ dp[0][i] = i; } for(int i = 1;i < m;i++){ dp[i][0] = i; } 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-1],dp[i][j-1]), dp[i-1][j]) + 1; } } } if(dp[m][n] > 1) return false; return true; } }

__EOF__

本文作者Younger
本文链接https://www.cnblogs.com/youngerwb/p/16275123.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   YoungerWb  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示