准备字符串中的重复字符 - 算法

时间:2015-11-10 22:28:23

标签: string algorithm recursion

给出三个字符串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

重复值导致我成为一个主要问题。

bc中的字符都等于1 - Background 2 - Legal Requirements 2.1 - State Legal Requirements 2.1.1 - Regulations 4 - Quiz 3 - Site Security 中的字符

时,我需要执行某些操作

1 个答案:

答案 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的第一个字母)