日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】72. 编辑距离(Java、字符串、动态规划)

發布時間:2024/7/23 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】72. 编辑距离(Java、字符串、动态规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 && 代碼 O(n2n^2n2)、O(n2n^2n2)
      • 二刷

打卡第十三天~

題目描述

  • 感覺和正則表達式匹配這道題很像:同樣的兩個字符串,同樣的二維數組dp,同樣的hard。。= =

思路 && 代碼 O(n2n^2n2)、O(n2n^2n2)

  • 使用動態規劃的做法,同樣多開一行、一列來進行邊界處理。
  • dp[i][j]:以[0, i] 和 [0, j]的子串,word1Son轉化成word2Son的最少操作數字
  • 具體做法見注釋的 part 和 Case~
  • 主要代碼應該是注釋 part 2.2 部分的代碼,可以這么理解
    0. 對于當前 dp[i][j] 的選取值,i、j匹配的情況顯而易見是直接選取dp[i - 1][j - 1]最優
  • 不匹配的情況,有三個最優子結構:左邊的dp[i][j - 1],上邊的dp[i - 1][j],以及左上的dp[i -1][j - 1]。經過思考,我們可以發現這三個最優子結構,可以分別通過增、刪、減的方式(操作數 + 1),轉移到 dp[i][j] 的狀態。
  • 那么顯而易見,選取三個子結構的最小值,再增加一個操作數就是當前的最優選擇~
class Solution {public int minDistance(String word1, String word2) {// initint m = word1.length();int n = word2.length();// dp[i][j]:以[0, i] 和 [0, j]的子串,word1Son轉化成word2Son的最少操作數字int[][] dp = new int[m + 1][n + 1];// part 1:邊界:// part 1.1: 直接插入for(int i = 0; i <= n; i++) {dp[0][i] = i;}// part 1.2: 直接刪除for(int i = 0; i <= m; i++) {dp[i][0] = i;}// part 2:具體規劃過程for(int i = 1; i <= m; i++) {for(int j = 1; j <= n; j++) {// part 2.2: 當前字符不匹配:if(word1.charAt(i - 1) != word2.charAt(j - 1)) {// Case 1: 刪除當前i字符 + dp[i - 1][j](刪)// Case 2: dp[i][j - 1] + 插入j字符(插)// Case 3: dp[i - 1][j - 1] + i 和 j 對著替換一個。(替)// 三種選擇,選取步驟最少的一個dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;}// part 2.1: 直接匹配,不用操作else {dp[i][j] = dp[i - 1][j - 1];}}}return dp[m][n];} }

二刷

  • 一如既往地明了,有效代碼其實就12行
class Solution {public int minDistance(String word1, String word2) {// dp[i][j]:把 word1[0][i] 變成 word2[0][j] 需要的步數int[][] dp = new int[word1.length() + 1][word2.length() + 1]; // 直接刪成 word2for(int i = 0; i <= word1.length(); i++) {dp[i][0] = i;}// 直接插成 word2for(int i = 0; i <= word2.length(); i++) {dp[0][i] = i;}for(int i = 1; i <= word1.length(); i++) {for(int j = 1; j <= word2.length(); j++) {// 相等,相當于不用動,直接取上一階的結果if(word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];}// 不相等,取改、刪、插的最小值 + 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[word1.length()][word2.length()];} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】72. 编辑距离(Java、字符串、动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。