1. 程式人生 > >Edit distance(二維動態規劃題目)

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); /無論如何都要操作一次,三種操作中選出最小的數字,分別對應插入,替換,刪除

/ return 1 + min(editDist(str1, str2, m, n - 1), editDist(str1, str2, m - 1, n - 1), editDist(str1, str2, m - 1, n));

 }
 //採用動態規劃的思想解決
 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; } }