面试题 01.05. 一次编辑
面试题 01.05. 一次编辑
方法一:DP
1、dp数组定义
dp[ i ] [ j ] 表示以i-1,j-1结尾的两个字符串的需要最小的编辑距离。
存在一次编辑的时候一共有四种情况:
1. len ( str1) > len ( str2) , 相当于str2需要增加一个字符,或者 str1 删除一个字符。
2. len ( str1 ) == len ( str2 ),相当于替换str1一个字符, 或者替换 str2 一个字符。
3. len ( str1) < len ( str2),相当于str1增加一个字符,或者str2删除一个字符。
4. str1.equals(str2) 符合条件的情况
2、状态转移方程
前三种情况 可以合并为同一种情况,就是做了一次编辑:
dp [ i ] [ j ] = min { dp[ i-1 ] [ j ], dp[ i ] [ j - 1 ], dp[ i ] [ j ] } + 1 ;
第四种情况是截止到某个( i , j )位置都没有做修改的时候:
dp[ i ] [ j ] = dp[ i - 1 ] [ j - 1 ];
3、时空复杂度:
时间O(n*n) 空间O(n*n)
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(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;}}}return dp[m][n] == 1 || dp[m][n] == 0;}
}
方法二:模拟
1、模拟流程:
1. 首先确定做了一次修改 字符串长度相差1 或者 0即可
2. 两个同步指针i j ,相同的时候同步后移,不相同的时候分 两种情况
①相差一个字符:(插入引起的不同)
len( str1 ) - len(str2) == 1时:
j--;
不能用 i++,有可能会跳过连续两个编辑的情况(一个增加一个修改)
len( str1 ) - len(str2) == -1时:
i--;
count--;
不能用 j++,有可能会跳过连续两个编辑的情况(一个增加一个修改)
例如:整体相差一个但是出现连续两个字符做了修改
"teacher"
"bleacher"
②字符数目相同:(修改引起的不同)
count--;
2、时空复杂度:
时间O(n) 空间O(1)
class Solution {public boolean oneEditAway(String first, String second) {int len = first.length()-second.length();if (len > 1 || len < -1) { //只能相差一个字符return false;}int count = 1;for (int i = 0, j = 0; i < first.length() && j < second.length(); i++, j++) {if (first.charAt(i) != second.charAt(j)) {//替换一个字符的直接默认是符合条件的if (len == 1) { //second需要添加一个字符,移动元素少的字符串的指针,不然容易跳j--; }else if (len == -1) { //second需要删除一个字符,移动元素少的字符串的指针,不然容易跳i--; }count--;}if (count < 0) {//最多编辑一次return false;}}return true; }
}
面试题 01.05. 一次编辑相关推荐
- 程序员面试金典 - 面试题 01.05. 一次编辑(编辑距离,DP)
1. 题目 字符串有三种编辑操作:插入一个字符.删除一个字符或者替换一个字符. 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑. 示例 1: 输入: first = "p ...
- 面试题01.05.一次编辑
字符串有三种编辑操作:插入一个英文字符.删除一个英文字符或者替换一个英文字符.给定两个字符串,编写一个函数判断他们是否只需要一次(或者零次)编辑. 示例一: 输入:first="pale&q ...
- 文巾解题 01.05. 一次编辑
1 题目描述 2 解题思路: 建立一个指针i+一个错位个数计数器num(表示长的字符的第i+num位和短的字符的第i位匹配) class Solution:def oneEditAway(self, ...
- python【力扣LeetCode算法题库】面试题 01.07- 旋转矩阵
面试题 01.07. 旋转矩阵 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节.请你设计一种算法,将图像旋转 90 度. 不占用额外内存空间能否做到? 示例 1: 给定 mat ...
- python【力扣LeetCode算法题库】面试题 01.06-字符串压缩
面试题 01.06. 字符串压缩 字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若"压缩"后 ...
- LeetCode Algorithm 面试题 10.05. 稀疏数组搜索
面试题 10.05. 稀疏数组搜索 Ideas 没啥好说的,二分搜索就完了,注意过滤空字符串. Code Python from typing import Listclass Solution:de ...
- [Leedcode][JAVA][面试题 01.07][找规律][旋转数组]
[问题描述] [面试题 01.07. 旋转矩阵] 示例 1:给定 matrix = [[1,2,3],[4,5,6],[7,8,9] ],原地旋转输入矩阵,使其变为: [[7,4,1],[8,5,2] ...
- 面试题 03.05. 栈排序
面试题 03.05. 栈排序 思路:2个栈,data存储顺序,help帮助data存储排序 class SortedStack { public:stack<int> data, help ...
- 面试题 02.05. 链表求和
面试题 02.05. 链表求和 给定两个用链表表示的整数,每个节点包含一个数位. 这些数位是反向存放的,也就是个位排在链表首部. 编写函数对这两个整数求和,并用链表形式返回结果. 示例: 输入:(7 ...
最新文章
- [云炬创业基础笔记]第六章商业模式测试6
- ICCV 2019 | 通过多标签相关性研究提升神经网络视频分类能力
- .NET Core中间件与依赖注入的一些思考
- 【UVA - 11292】Dragon of Loowater (贪心,水题,模拟,twopointer双指针)
- LeetCode 775. 全局倒置与局部倒置(归并排序/二分查找/一次遍历)
- mmap 系统调用 的使用
- Spring事务管理的四种方式(以银行转账为例)
- 电脑公司最新稳定win7系统下载
- Java程序员的职业规划
- t3系统建账请到服务器端修改,用友T3标准版常见问题及处理方法(一)
- mysql 官网 update_UPDATE
- Xcode 秘籍 —— 很多 iOS 开发者都不知道的基本操作
- gradient设置上下渐变_CSS3 线性渐变(linear-gradient)
- 移动端手机 摇一摇加声音
- 如何建立企业级数据分析能力?
- UGUI源码解析——ContentSizeFitter
- day69 【哈希,HashSet,HashMap】
- websocket协议详解
- 项目六总结 创建与使用存储过程
- GUI线程安全详解(三)