【发布时间】:2014-11-19 18:39:00
【问题描述】:
我学习了使用动态编程查找最长公共子串的程序。我们也可以使用动态规划来找出字符串中是否存在子字符串吗?
我试过了。但是,这似乎使事情变得更加复杂!
下面是我尝试过的伪代码。
字符串:你好
子字符串: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) 后跟当前字符的下一个索引或 false
调用:substring('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;
}
}
}
【问题讨论】:
-
这是一个递归定义:“函数
f(needle, haystack)通过在needle == haystack(1:length(needle))或f(needle, haystack(2:end))中返回true来确定子字符串needle是否出现在更大的字符串干草堆中”现在应用DP。 -
所以您发布的伪代码类似于您的真实代码。请发布编译时没有错误和警告的真实代码 - 除非是编译器错误让你感到困惑。
-
“我学会了使用动态规划寻找最长公共子串的程序。我们也可以使用动态规划来找出字符串中是否存在子串吗?” 你怎么可能做到前者不能做后者?
-
false、true和pos是不同的类型。
标签: c++ c algorithm dynamic-programming