字符混编

对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变。请编写一个高效算法,判断C串是否由A和B交错组成。

给定三个字符串A,BC,及他们的长度。请返回一个bool值,代表C是否由A和B交错组成。保证三个串的长度均小于等于100。

测试样例:

"ABC",3,"12C",3,"A12BCC",6

返回:true


解析:

strA=“ABC”

strB=“12C”

aim=“A12BCC”


strA[0,i…lenA] 

strB[0,j…lenB]

aim[0,i+j-1….lenA+lenB-1]

使用动态规划的方法

方便理解我们添加空字符

dp[i][j]表示strA[0~i]与strB[0~j]能否组成aim[0,i+j-1] 能=true 否=false

dp表

字符混编_第1张图片

aim的最后一个字符肯定是由strA的最后一个字符或者strB的最后一个字符提供的。

因此可以理解为

dp[i][j] = dp[i-1][j]&&strA[i]==aim[i+j] 或则 dp[i][j-1]&&strB[j]==aim[i+j]; 


代码:

 public boolean chkMixture(String A, int n, String B, int m, String C, int v) {

        StringBuilder stringA = new StringBuilder(A);

        StringBuilder stringB = new StringBuilder(B);

        StringBuilder stringC = new StringBuilder(C);

        Boolean[] dp = new Boolean[m+1];

        dp[0] = true;

        for (int i = 1; i < m+1; i++) {//初始化第一行

           if (stringB.charAt(i-1)==stringC.charAt(i-1)){

               dp[i] = true;

           }else{

               dp[i] = false;

           }

        }

        for (int i = 0; i < n; i++) {

            for (int j = 1; j < m+1; j++) {

                dp[j] = (dp[j]&&stringA.charAt(i)==stringC.charAt(i+j))||(dp[j-1]&&stringB.charAt(j-1)==stringC.charAt(i+j));

            }

        }

        return dp[m];

    }


题目来源:http://www.nowcoder.com/practice/0ed4ac79ab264c6f9b58fc9ba6188793?rp=3&ru=/activity/oj&qru=/ta/2016test/question-ranking


你可能感兴趣的:(算法)