4.23 编辑距离-2 +技巧题
This commit is contained in:
parent
ba2c826ff3
commit
8855c19e89
27
src/main/java/dynamic_programming/MinDistance.java
Normal file
27
src/main/java/dynamic_programming/MinDistance.java
Normal 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];
|
||||
}
|
||||
}
|
48
src/main/java/dynamic_programming/minDistance2.java
Normal file
48
src/main/java/dynamic_programming/minDistance2.java
Normal 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];
|
||||
}
|
||||
}
|
28
src/main/java/trick/MajorityElement.java
Normal file
28
src/main/java/trick/MajorityElement.java
Normal 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;
|
||||
}
|
||||
}
|
39
src/main/java/trick/SingleNumber.java
Normal file
39
src/main/java/trick/SingleNumber.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user