4.23 编辑距离-2 +技巧题

This commit is contained in:
zhangsan 2025-04-23 14:22:45 +08:00
parent ba2c826ff3
commit 8855c19e89
4 changed files with 142 additions and 0 deletions

View File

@ -0,0 +1,27 @@
package dynamic_programming;
/**
* 题目 583. 两个字符串的删除操作 (minDistance)
* 描述给定两个单词 word1 word2 返回使得 word1 word2 相同所需的最小步数
* 每步 可以删除任意一个字符串中的一个字符
示例 1
输入: word1 = "sea", word2 = "eat"
输出: 2
解释: 第一步将 "sea" 变为 "ea" 第二步将 "eat "变为 "ea"
* 链接https://leetcode.cn/problems/delete-operation-for-two-strings/
*/
public class MinDistance {
public int minDistance(String word1, String word2) {
int len1=word1.length(),len2=word2.length();
int[][]dp=new int[len1+1][len2+1];
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if(word1.charAt(i-1)==word2.charAt(j-1))
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j]);
}
}
return len1+len2-2*dp[len1][len2];
}
}

View File

@ -0,0 +1,48 @@
package dynamic_programming;
/**
* 题目 72. 编辑距离 (minDistance)
* 描述给你两个单词 word1 word2 请返回将 word1 转换成 word2 所使用的最少操作数
* 你可以对一个单词进行如下三种操作
*
* 插入一个字符
* 删除一个字符
* 替换一个字符
示例 1
输入word1 = "horse", word2 = "ros"
输出3
解释
horse -> rorse ( 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
* 链接https://leetcode.cn/problems/edit-distance/
*/
//不会
public class minDistance2 {
//https://programmercarl.com/0072.%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB.html#%E6%80%9D%E8%B7%AF
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
int[][] dp = new int[m + 1][n + 1];
// 初始化
for (int i = 1; i <= m; i++) {
dp[i][0] = i;
}
for (int j = 1; j <= n; j++) {
dp[0][j] = j;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
// 因为dp数组有效位从1开始
// 所以当前遍历到的字符串的位置为i-1 | j-1
if (word1.charAt(i - 1) == word2.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;
}
}
}
return dp[m][n];
}
}

View File

@ -0,0 +1,28 @@
package trick;
/**
* 题目 169. 多数元素 (majorityElement)
* 描述给定一个大小为 n 的数组 nums 返回其中的多数元素多数元素是指在数组中出现次数 大于 n/2 的元素
* 你可以假设数组是非空的并且给定的数组总是存在多数元素
*
示例 1
输入nums = [3,2,3]
输出3
* 链接https://leetcode.cn/problems/majority-element/
*/
public class MajorityElement {
public int majorityElement(int[] nums) {
int candidate = 0, count = 0;
for (int num : nums) {
if (count == 0) {
candidate = num; // 选举新候选
count = 1;
} else if (num == candidate) {
count++; // 支持候选者
} else {
count--; // 反对候选者
}
}
return candidate;
}
}

View File

@ -0,0 +1,39 @@
package trick;
import java.util.HashSet;
/**
* 题目 136. 只出现一次的数字 (singleNumber)
* 描述给你一个 非空 整数数组 nums 除了某个元素只出现一次以外其余每个元素均出现两次找出那个只出现了一次的元素
* 你必须设计并实现线性时间复杂度的算法来解决此问题且该算法只使用常量额外空间
*
示例 1
输入nums = [2,2,1]
输出1
* 链接https://leetcode.cn/problems/single-number/
*/
public class SingleNumber {
public int singleNumber(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int num : nums) {
if (!set.add(num)) // add() 返回 false 表示已经存在
set.remove(num);
}
// 直接从 set 出唯一的元素
return set.iterator().next();
}
/**
* 直接对所有数做位异或
异或满足 a^a=0, 0^b=b 的特性所以成对出现的数都会被异或消掉最后剩下的就是那个只出现一次的数
*/
public int singleNumber2(int[] nums) {
int res = 0;
for (int num : nums) {
res ^= num;
}
return res;
}
}