zoukankan      html  css  js  c++  java
  • 097 Interleaving String 交错字符串

    给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
    例如,
    给定:
    s1 = "aabcc",
    s2 = "dbbca",
    当 s3 = "aadbbcbcac", 返回 true.
    当 s3 = "aadbbbaccc", 返回 false.
    详见:https://leetcode.com/problems/interleaving-string/description/

       Ø d b b c a
    Ø T F F F F F
    a T F F F F F
    a T T T T T F
    b F T T F T F
    c F F T T T T
    c F F F T F T

    字符串s1和s2的长度和必须等于s3的长度,如果不等于,肯定返回false。那么当s1和s2是空串的时候,s3必然是空串,则返回true。所以直接给dp[0][0]赋值true,然后若s1和s2其中的一个为空串的话,那么另一个肯定和s3的长度相等,则按位比较,若相同且上一个位置为True,赋True,其余情况都赋False,这样的二维数组dp的边缘就初始化好了。在任意非边缘位置dp[i][j]时,它的左边或上边有可能为True或是False,两边都可以更新过来,只要有一条路通着,那么这个点就可以为True。那么分别来看,如果左边的为True,那么去除当前对应的s2中的字符串s2[j - 1] 和 s3中对应的位置的字符相比(计算对应位置时还要考虑已匹配的s1中的字符),为s3[j - 1 + i], 如果相等,则赋True,反之赋False。 而上边为True的情况也类似,所以可以求出递推公式为:
    dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[i - 1 + j]) || (dp[i][j - 1] && s2[j - 1] == s3[j - 1 + i]);
    其中dp[i][j] 表示的是 s2 的前 i 个字符和 s1 的前 j 个字符是否匹配 s3 的前 i+j 个字符。

    Java实现:

    class Solution {
        public boolean isInterleave(String s1, String s2, String s3) {
            int m=s1.length();
            int n=s2.length();
            if(m+n!=s3.length()){
                return false;
            }
            boolean[][] path=new boolean[m+1][n+1];
            for(int i=0;i<m+1;++i){
                for(int j=0;j<n+1;++j){
                    if(i==0&&j==0){
                        path[i][j]=true;
                    }else if(i==0){
                        path[i][j]=path[i][j-1]&&(s2.charAt(j-1)==s3.charAt(j-1));
                    }else if(j==0){
                        path[i][j]=path[i-1][j]&&(s1.charAt(i-1)==s3.charAt(i-1));
                    }else{
                        path[i][j] = (path[i][j-1] && (s2.charAt(j-1)==s3.charAt(i+j-1)))
                                  || (path[i-1][j] && (s1.charAt(i-1)==s3.charAt(i+j-1)));
                    }
                }
            }
            return path[m][n];
        }
    }
    

    参考:https://www.cnblogs.com/grandyang/p/4298664.html

  • 相关阅读:
    sql except 用法,找两个表中非共同拥有的
    ‘堆’出你的洪荒之力
    原来你是个这样的JVM
    变形词
    54题
    最大对称子数组
    java 线程之间通信以及notify与notifyAll区别。
    大型网站架构系列:消息队列
    剑指offer第10题
    & 和 && 区别
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8717712.html
Copyright © 2011-2022 走看看