我们如何使用动态编程来解决子串匹配检查问题

时间:2014-11-19 18:39:00

标签: c++ c algorithm dynamic-programming

我学会了使用动态编程找到最长公共子串的程序。我们还可以使用动态编程来查明字符串中是否存在子字符串吗?

我试了一下。然而,它似乎使事情变得更复杂!

以下是我尝试的伪代码。

字符串:Helello

子串:llo

f(n):如果未找到子字符串的字符或找到的位置的位置

,则返回false

f(0)=匹配索引或错误

f(1)= f(0)索引的下一个索引是substring [1]或false

f(2)= f(1)索引的下一个索引是substring [1]或false

f(n)= f(n-1)后跟当前char的下一个索引或false

致电:子串('你好',2,' el');

substring(str, n, substring)
{
        if(n == 0)
        {
                for(i=0;i<strlen(str);i++)
                {
                        if(str[i] == substring[n])
                                pos[] = i; //append i to positions array
                }
                if(pos) return pos;
                return false;
        }
        else
        {
                indexes = substring(str, n-1, substring);
                if(indexes)
                {
                        foreach(indexes as index)
                        {
                                if(str[index+1] == substring[n])
                                        return true;
                        }
                        return false;
                }
        }

}

1 个答案:

答案 0 :(得分:1)

我认为你不能用DP解决这个问题。

例如,假设你有一个句子S和一个单词W.你想检查给定的单词W是否是句子S的子串。只有当LCS的长度(最长的公共子串)时才能用DP做到这一点等于字W的长度,这意味着W实际上是LCS。复杂度为O(N * M),其中N是S的长度,M是W的长度。

使用KMP,O(N + M)或散列可以做得更好。