这是来自算法设计手册的问题:
假设您有三个字符串:
X
,Y
和Z
,其中|X| = n
,|Y| = m
和|Z| = n+m.
Z
被认为是X
和Y
的混合,当且仅当Z
可以通过交错形成来自X
和Y
的字符,其方式是维护每个字符串中字符的从左到右排序。提供有效的动态编程算法,确定
Z
是否为X
和Y
的随机播放。提示:您构造的动态编程矩阵的值应为布尔值,而不是数值
这就是我的尝试:
最初,我制作了一个1-D char数组,并分别指向X,Y,Z的起始字符。如果匹配X指针的Z指针在char数组中存储X,则使用Y指针检查它。如果char数组中的每个条目与其最后一个条目没有不同,则Z不是交错的。
有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
首先,让我们从一些定义开始。我为X[i]
的{{1}}元素编写了i
,为X
的子字符串编写X[i)
从索引X
开始。
例如,如果i
,则X = abcde
和X[2] = c
。
类似的定义适用于X[2) = cde
和Y
。
要通过动态编程解决问题,您应该保留大小为Z
的2D布尔数组A
。在此数组中,(n+1) x (m+1)
当且仅当A[i, j] = true
和X[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
如果您首先填充数组的边框(Z
和A[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)
关键点:
代码:
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;
}