给出三个字符串a,b和c。试图以递归方式检查c是否是a和b的散布版本。
一个例子就是。
a = dolphin
b = whale
c = dolwhphialne
你可以看到c字符串中的字符与它们在原始字符串中的字符顺序相同,只是拖了一下。
我正在研究的算法是。
Algorithm: stringOrderedCheck(a,b,c)
n:= length of a
m:= length of b
nm:= length of a and b
if (nm > 0) then
if(first letter of a equals first letter of c) then
return stringOrderedCheck(a without first letter,b, c without first letter)
else if(first letter of b equals first letter of c) then
return stringOrderedCheck(a,b without first letter, c without first letter)
else
return false;
但我得到的问题就是这个例子:
a = yyyyb
b = yyyx
c = yyyyxyyyb
如何准备函数以实现它需要从a
获取y
的第一个字母,然后从b
获取yyyx
a
重复值导致我成为一个主要问题。
当b
和c
中的字符都等于1 - Background
2 - Legal Requirements
2.1 - State Legal Requirements
2.1.1 - Regulations
4 - Quiz
3 - Site Security
中的字符
答案 0 :(得分:1)
我认为这里的主要问题是,在这一点上,你的路径可以分成两个单独的递归调用,即树分裂而不是仅仅更深入。问题在于,由于你的else if
,第二条路径只考虑第一条路径,即它从不考虑两条路径。然后你可以为此做好准备:
#your original code
if(first letter of a equals first letter of c) then
return stringOrderedCheck(a without first letter,b, c without first letter)
else if(first letter of b equals first letter of c) then
return stringOrderedCheck(a,b without first letter, c without first letter)
您可以将其更改为:
if(first letter of a equals first letter of c) then
if(first letter of b equals first letter of c) then
return stringOrderedCheck(a without first letter,b, c without first letter) OR stringOrderedCheck(a,b without first letter, c without first letter)
else
return stringOrderedCheck(a without first letter,b, c without first letter)
else if(first letter of b equals first letter of c) then
return stringOrderedCheck(a,b without first letter, c without first letter)
这样无论第一个条件如何,它都会检查两者。
您还可以通过将bool保存为变量来进行更改,然后再检查if,然后断言一般或:
valid:= false
if(first letter of a equals first letter of c) then
valid = valid or stringOrderedCheck(a without first letter,b, c without first letter)
if(first letter of b equals first letter of c) then #take out the else so it will always check
valid = valid or stringOrderedCheck(a,b without first letter, c without first letter)
return valid
这最后一个解决方案显示了一个非常重要的注意事项:确保在if / else if语句后面有一个else,返回false(如果你不使用最后的解决方案)来说明c的第一个字母是否是直的无效(即不是a或b的第一个字母)