检查字符串是否是另外两个给定字符串的混乱

时间:2013-11-24 10:53:59

标签: string algorithm dynamic-programming

这是来自算法设计手册的问题:

  

假设您有三个字符串:XYZ,其中|X| = n,   |Y| = m|Z| = n+m. Z被认为是XY的混合,当且仅当Z可以通过交错形成来自XY的字符,其方式是维护每个字符串中字符的从左到右排序。

     

提供有效的动态编程算法,确定Z是否为XY的随机播放。

     

提示:您构造的动态编程矩阵的值应为布尔值,而不是数值

这就是我的尝试:

最初,我制作了一个1-D char数组,并分别指向X,Y,Z的起始字符。如果匹配X指针的Z指针在char数组中存储X,则使用Y指针检查它。如果char数组中的每个条目与其最后一个条目没有不同,则Z不是交错的。

有人可以帮我解决这个问题吗?

6 个答案:

答案 0 :(得分:3)

首先,让我们从一些定义开始。我为X[i]的{​​{1}}元素编写了i,为X的子字符串编写X[i)从索引X开始。

例如,如果i,则X = abcdeX[2] = c

类似的定义适用于X[2) = cdeY


要通过动态编程解决问题,您应该保留大小为Z的2D布尔数组A。在此数组中,(n+1) x (m+1)当且仅当A[i, j] = trueX[i)可以交错形成Y[j)

对于任意Z[i+j),在2D数组中间某处,递归关系非常简单:

(i, j)

在2D数组的边缘,您可以看到A[i, j] := X[i] = Z[i+j] and A[i+1, j] or Y[j] = Z[i+j] and A[i, j+1] X已经在其末尾,这意味着另一个的后缀应该等于{{1的后缀}}:

Y

如果您首先填充数组的边框(ZA[m, j] := Y[j) = Z[m+j) A[i, n] := X[i) = Z[i+n) A[m, n] := true ,对于所有A[m, j]),则可以简单地循环回A[i, n]并设置条目适当。最后i, j是你的答案。

答案 1 :(得分:2)

以下方法应该给你一个想法。

定义条件d(s1,s2,s3) = (s1 + s2 == s3) { s3 is a shuffle of s1 and s2 }

我们必须找到d( X, Y, Z )

如果s1和s2的长度各为1且s3的长度= 2,则

d( s1,s2,s3 ) = { (s1[0] == s3[0] && s2[0] == s3[1]) || (s1[0] == s3[1] && s2[0] == s3[0])

类似地,对于空字符串可以获得d。

对于任意长度的字符串,以下关系成立。

d( s1,s2,s3 ) = { ( d( s1-s1[last],s2,s3 - s3[last]) && s1[last] == s3[last] )
                  || ( d( s1,s2 - s2[last],s3 - s3[last]) && s2[last] == s3[last] )
                }

您可以从零长度字符串开始计算d()条目并继续检查。

答案 2 :(得分:1)

它由以下递归关系定义: -

S(i,j,k) = false

if(Z(i)==Y(k))
  S(i,j,k) = S(i,j,k)||S(i+1,j,k+1)

if(Z(i)==X(j))
  S(i,j,k) = S(i,j,k)||S(i+1,j+1,k)

Where S(i,j,k) corresponds to Z[i to end] formed by shuffle of X[j to end] and Y[K to end]

您应该尝试自行将其编码为DP。

答案 3 :(得分:0)

    function checkShuffle(str1, str2, str3) {
      var merge=str1+str2;
      var charArr1= merge.split("").sort();
      var charArr2= str3.split("").sort();
      for(i=0;i<str3.length;i++){
         if(charArr1[i] == charArr2[i]){
            return true; 
         }
      }    
     return false;
   }
checkShuffle("abc", "def", "dfabce"); //output is true

答案 4 :(得分:0)

基于JavaSCRIPT的解决方案

 const first = "bac";
 const second = "def"
 const third = "dabecf";

function createDict(seq,str){
   let strObj = {};
   str = str.split("");
   str.forEach((letter,index)=>{
   strObj[letter] = {
       wordSeq: seq,
       index : index

   } ;
   })
   return strObj;
 }

function checkShuffleValidity(thirdWord,firstWord,secondWord){
    let firstWordDict = createDict('first',firstWord);
    let secondWordDict = createDict('second',secondWord);
    let wordDict = {...firstWordDict,...secondWordDict};
    let firstCount=0,secondCount = 0;
    thirdWord = thirdWord.split("");
    for(let i=0; i<thirdWord.length; i++){
        let letter = thirdWord[i];
         if(wordDict[letter].wordSeq == "first"){
      if(wordDict[letter].index === firstCount){
         firstCount++;
      }else{
        return false
      }        
    }else{
    if(wordDict[letter].index === secondCount){
      secondCount++;
    }else{
      return false;
    }

    }
}  
return true;
}

 console.log(checkShuffleValidity(third,first,second));

答案 5 :(得分:-1)

关键点:

  1. 所有字符串都不应为空或空。
  2. 2个字符串长度的总和应该等于第三个字符串。
  3. 第三个字符串不应包含2个字符串的子字符串。
  4. 否则创建字符数组,排序和比较。
  5. 代码:

    public static boolean validShuffle(String first, String second, String third){
      boolean status=false;
      if((first==null || second==null || third==null) || (first.isEmpty()|| second.isEmpty() || third.isEmpty())){
        status = false;
      } else if((first.length()+second.length()) !=third.length()){
        //check if the sum of 2 lengths equals to the third string length
        status = false;
      } else if(third.indexOf(first,0)!=-1 || third.indexOf(second,0)!=-1){
        //check if the third string contains substrings
        status = false;
      } else {
        char [] c1_2=(first+second).toCharArray();
        char [] c3 =third.toCharArray();
        Arrays.sort(c1_2);
        Arrays.sort(c3);
        status=Arrays.equals(c1_2, c3);
      }
      return status;
    }