题解 | #牛群编号变更# Java
牛群编号变更
https://www.nowcoder.com/practice/9295f0f796b34793832710d5c939a619
`编辑距离`原题简化版 这题还可以是 `插入`、`删除`、`修改`三个操作,还可以把每个操作赋予一个代价,求最少操作代价
dp[i][j]表示将字符串word1的前i个字符变为字符串word2的前j个字符所需的最少操作次数。
我们需要初始化dp数组的边界条件。当word1为空串时,也就是i=0时,dp[0][j]等于j,表示将空串变为word2的前j个字符需要插入j个字符。同理,当word2为空串时,也就是j=0时,dp[i][0]等于i,表示将word1的前i个字符变为空串需要删除i个字符。
通过递推关系式来更新dp数组的其他位置。对于dp[i][j],如果word1的第i个字符等于word2的第j个字符,说明不需要进行操作,此时可以继续判断dp[i-1][j-1],即dp[i][j] = dp[i-1][j-1]。如果word1的第i个字符不等于word2的第j个字符,说明需要进行操作,然后可以选择插入字符、删除字符中的一种操作,即dp[i][j] = Math.min(dp[i][j - 1] + 1, dp[i - 1][j] + 1);
import java.util.*; public class Solution { 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 = 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 (word1.charAt(i - 1) == word2.charAt(j - 1)) { dp[i][j] = dp[i - 1][j - 1]; } else { dp[i][j] = Math.min(dp[i][j - 1] + 1, dp[i - 1][j] + 1); } } } return dp[m][n]; } }
数组、链表、栈、队列、堆、树、图等。 查找和排序:二分查找、线性查找、快速排序、归并排序、堆排序等。 动态规划:背包问题、最长公共子序列、最短路径 贪心算法:活动选择、霍夫曼编码 图:深度优先搜索、广度优先搜索、拓扑排序、最短路径算法(如 Dijkstra、Floyd-Warshall) 字符串操作:KMP 算法、正则表达式匹配 回溯算法:八皇后问题、0-1 背包问题 分治算法:归并排序、快速排序