我学会了使用动态编程找到最长公共子串的程序。我们还可以使用动态编程来查明字符串中是否存在子字符串吗?
我试了一下。然而,它似乎使事情变得更复杂!
以下是我尝试的伪代码。
字符串:Helello
子串:llo
f(n):如果未找到子字符串的字符或找到的位置的位置
,则返回falsef(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;
}
}
}
答案 0 :(得分:1)
我认为你不能用DP解决这个问题。
例如,假设你有一个句子S和一个单词W.你想检查给定的单词W是否是句子S的子串。只有当LCS的长度(最长的公共子串)时才能用DP做到这一点等于字W的长度,这意味着W实际上是LCS。复杂度为O(N * M),其中N是S的长度,M是W的长度。
使用KMP,O(N + M)或散列可以做得更好。