我们如何使用动态规划解决子字符串匹配检查

How can we solve substring matching check using Dynamic Programming

本文关键字:字符 字符串 串匹配 检查 解决 何使用 动态规划 我们      更新时间:2023-10-16

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

我试过了。但是,它似乎使事情变得更加复杂!

下面是我尝试过的伪代码。

弦 : 海洛

子字符串 : llo

f(n) : 如果未找到子字符串的字符或找到的位置,则返回 false

f(0) = 匹配索引或假

f(1) = f(0) 索引的下一个索引是子字符串 [1] 或假

f(2) = f(1) 索引的下一个索引是子字符串[1] 或假

f(n) = f(n-1) 后跟当前字符的下一个索引或假

调用 : 子字符串('hello', 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;
                }
        }
}

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

例如,假设您有一个句子 S 和单词 W。您要检查给定的单词 W 是否是句子 S 的子字符串。只有当 LCS(最长公共子字符串)的长度等于单词 W 的长度时,您才能使用 DP 执行此操作,这意味着 W 实际上是那个 LCS。复杂度为 O(N * M),其中 N 是 S 的长度,M 是 W 的长度。

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