Edit distance(二維動態規劃題目)
題目1 Edit Distance
傳統動態規劃問題,兩個字串不一樣,對第一個字元每一個位置可以進行刪除,修改或者增加,將第一個字串改成第二個字串,求最小的運算元 a) Insert a character b) Delete a character c) Replace a character
第一字串長度為m, 長度為n; 方法: 可見要求DP[i+1][j+1],必須要知道二維矩陣中左上,上方和下方的3個值。所以當我們確定第0行和第0列的值後,就可以從上到下、從左到右的計算了。 a) 插入一個字元:word1[0:i] -> word2[0:j-1],然後在word1[0:i]後插入word2[j] DP[i+1][j+1] = DP[i+1][j]+1 b) 刪除一個字元:word1[0:i-1] -> word2[0:j],然後刪除word1[i] DP[i+1][j+1] = DP[i][j+1]+1 刪除一個S當前的字串 ,所以i減少一個, c)替換一個字元: word1[i] != word2[j]時,word1[i] -> word2[j]:DP[i+1][j+1] = DP[i][j] + 1
- Created by liuxiongcheng on 2017/4/10. */ public class Editdistance {
static int min(int x,int y,int z) { if(x<y&&x<z) return x; else if(y<x&&y<z) return y; else return x; } //遞迴函式解決 static int editDist(String str1,String str2,int m,int n)/把第一個字串變成第二字串/ { if (m == 0) return n; if (n == 0) return m; if (str1.charAt(m - 1) == str2.charAt(n - 1)) return editDist(str1, str2, m - 1, n - 1); /無論如何都要操作一次,三種操作中選出最小的數字,分別對應插入,替換,刪除
} //採用動態規劃的思想解決 static int editDsitDP(String str1,String str2,int m,int n) { int dp[][]=new int [m+1][n+1]; for(int i=0;i<=m;i++) { for(int j=0;j<=n;j++) { if(i==0) { dp[i][j]=j; } else if (j==0) { dp[i][j]=i; } else if(str1.charAt(i-1)==str2.charAt(j-1)) //相同元素,不用做任何修改,直接等於前面對角處的元素, dp[i][j]=dp[i-1][j-1]; else // 在元素中 下面三種情況分別對應 周邊四種情況,在 dp[i][j]=1+ min (dp[i-1][j],dp[i][j-1],dp[i-1][j-1]); dp[i][j] = 1+dp[i-1][j-1] ----代表 替換, dp[i][] } } return dp[m][n]; } public static void main(String[] args) { String a="saturday"; String b="sunday"; int m=a.length(); int n=b.length(); System.out.println(editDist(b,a,n,m)); }
}
# 題目二392. Is Subsequence
從背後進行修改,判斷
Example 1:
s = "abc", t = "ahbgdc"
Return true.
Example 2:
s = "axc", t = "ahbgdc"
Return false.
判斷s 是否是t的一個子字串即可
class Solution { public boolean isSubsequence(String s, String t) { int m = s.length(), n = t.length(); //n是否為空 true, if(m==0) return true; int i=m-1,j=n-1; while(i>=0 && j>=0){ //兩種同時滿足情況 if(s.charAt(i)t.charAt(j)){ –i; –j; } //讓i回退 else { –j; } } // 判斷能否處理完所有的元素, if(i-1) return true; return false; } }