String 最长有效子序列

String 最长有效子序列,string,algorithm,String,Algorithm,我遇到了这个编码问题 给定一个字符串s,并且函数是有效的(字符串str),编写一个函数 检查s中有效的最长子序列。例如,一个 “whreat”的子序列可以是“rat”、“eat”、“what”或“wheat”。请 不要推测isValid(stringstr)函数的实现 起初,我认为我可以使用DP来解决这个问题,但由于我们不能假设任何关于isValid(String str)的内容,即“wh”为true并不表示“whe”为true,因此我认为DP在这里不起作用。我能想到的唯一解决方案是回溯:获取字

我遇到了这个编码问题

给定一个字符串s,并且函数是有效的(字符串str),编写一个函数 检查s中有效的最长子序列。例如,一个 “whreat”的子序列可以是“rat”、“eat”、“what”或“wheat”。请 不要推测isValid(stringstr)函数的实现

起初,我认为我可以使用DP来解决这个问题,但由于我们不能假设任何关于isValid(String str)的内容,即“wh”为true并不表示“whe”为true,因此我认为DP在这里不起作用。我能想到的唯一解决方案是回溯:获取字符串的所有子序列并检查每个字符串。然而,我不认为这是最佳的解决方案


我的问题是,有没有更好的解决方案?非常感谢

您不必检查每个可能的子字符串。如果得到长度为4的有效字符串,则不需要检查长度为3或更短的字符串。因此,您可以从长组合开始,朝着最小的方向努力,并在找到第一个有效子字符串时停止。

您可以从最长的子序列开始优化它,如果找不到长长度的有效子序列,请检查字母较少的子序列

例如,首先检查选择所有字母是否为有效的子序列。如果没有,那么您将测试是否有长度为n-1的子序列是有效的,等等。在每个阶段,如果您得到isValid=true,您可以简单地返回找到的子序列,因为它被承诺是最长的有效子序列(因为较长的子序列已经被取消资格)


要查找长度为mDora,是否允许重新排序?“茶”也是一个很好的解决方案吗?@JeanLeMoignan不,子序列必须保持最初的顺序。如果没有任何额外的限制,没有什么办法比检查它们更好。证明思想:假设只有一个子序列是有效的(在所有子序列中)。我们需要尝试所有的方法来找出最坏的情况下到底是哪一个。您不必检查每个可能的子字符串。如果得到长度为4的有效字符串,则不需要检查长度为3或更短的字符串。因此,您可以从长组合开始,朝着最小的方向努力,并在找到第一个有效子字符串时停止。这是一个非常好的递归算法,您可以在其中检查
if isValid(s)返回s;否则返回thisFunc(s+1,strlen(s)-1)| | thisFunc(s,strlen(s)-1)在最坏的情况下它不会改变任何东西(如果最长的有效子序列只有一个字符怎么办?)。True,上述算法优于在至少有一个长度大于0的有效子字符串的情况下检查所有可能的字符串。即使在最长有效子字符串只有一个字符的情况下,当您找到该字符串时,您也会停止,并且可能不会检查其他单字符子字符串。