我们如何使用动态规划解决子字符串匹配检查
How can we solve substring matching check using Dynamic Programming
我学会了使用动态编程找到最长的公共子字符串的程序。我们还可以使用动态规划来找出字符串中是否存在子字符串吗?
我试过了。但是,它似乎使事情变得更加复杂!
下面是我尝试过的伪代码。
弦 : 海洛
子字符串 : 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) 或散列做得更好。
相关文章:
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 将 NULL 与 C 的字符* 字符串一起使用
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 无法将常量字符字符串传递给模板类
- 如何组合一个宽字符字符串,中间插入一些空字符
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 从给定索引返回子字符字符串的函数
- 字符 [](c 字符串)的初始化标准
- 如何将字符字符串用作数学运算符
- 将 Unicode 字符/字符串写入文件
- C++,字符* 字符串修改
- 如何有效地用不同的整数元素替换字符字符串的元素
- C++:如果我们在字符串中添加一些整数,为什么它会从开头删除该数量的字符?(字符串 + 整数)
- strcpy正在复制sth字符i字符串.如何解决此错误
- 在C++中将双精度转换为字符*/字符串
- C 中的宽字符字符串
- 如何提取C 中的字符/字符串之间的字符串
- 无法将字符/字符串转换为int
- 带有指针的反转字符字符串
- 反转字符串中的 n 个字符(字符串中没有空格),而不使用 c++ 中的内置函数