给定两个单词 word1 word2,找到使得 word1 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

    分析:两种方法,一种取巧,用之前的题目略微改动,第二种方法dp定义为本题。
    方法一:还是求最大子序长度的题嘛,返回值改一下就好了。
    参考代码:
    public int minDistance(String word1, String word2) {
    int[][] dp = new int[word1.length()+1][word2.length()+1];
    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.max(dp[i-1][j],dp[i][j-1]);
    }
    }
    }
    return word1.length()+word2.length()-2*dp[word1.length()][word2.length()];
    }
    方法二:
    dp[i][j]定义为当前使数组相同所需要的最少操作次数
    如何得到?答:分为两种情况,一种是当前对比的字符相等,一种是当前对比的字符不相等
    情况一相对容易,字符相等就不用操作,将i-1,j-1的操作数复制过来就好啦
    情况二就需要对比判断一下取最小操作,分为三个,一个是dp[i-1][j-1]+2,即操作2次
    一个是dp[i-1][j]+1,删除i所在字符串的字符
    一个是dp[i][j-1]+1,删除j所在字符串的字符
    初值?答:需要将二维矩阵的第一行和第一列都设为0至n-1,因为这一行与这一列表示的是一个字符串为空,相等需要几次操作,那么就需要字符串长度的操作。

    参考代码:
    public int minDistance(String word1, String word2) {
    int[][] dp = new int[word1.length()+1][word2.length()+1];
    for(int i=0;i<=word1.length();i++){
    dp[i][0]=i;
    }
    for(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];
    }
    else{
    dp[i][j]=Math.min(dp[i-1][j-1]+2,Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
    }
    }
    }
    return dp[word1.length()][word2.length()];
    }