C++ 子字符串出现的计数

C++ 子字符串出现的计数,c++,c,C++,C,是否有一种有效的算法来计算较长字符串中子字符串X的出现总数Y 更具体地说,我想要的是,从B中选择A.size()元素的方法总数,以便存在与B匹配的所选元素的排列 示例如下:搜索字符串Y=ABCDBFGHIJ中出现的X=AB的总数 答案是2:第一个A和第二个B,第一个A和第五个B 我知道我们可以生成长字符串的所有排列(将是N!lengthNstringsY),并使用KMP算法搜索/计算X在Y中的出现次数 我们能做得更好吗 我试图解决的原始问题如下:假设我们有一个大小为r乘以c的大矩阵M(r和c在1

是否有一种有效的算法来计算较长字符串中子字符串
X
的出现总数
Y

更具体地说,我想要的是,从B中选择A.size()元素的方法总数,以便存在与B匹配的所选元素的排列

示例如下:搜索字符串
Y=ABCDBFGHIJ
中出现的
X=AB
的总数

答案是2:第一个A和第二个B,第一个A和第五个B

我知道我们可以生成长字符串的所有排列(将是
N!
length
N
strings
Y
),并使用KMP算法搜索/计算
X
Y
中的出现次数

我们能做得更好吗

我试图解决的原始问题如下:假设我们有一个大小为r乘以c的大矩阵M(r和c在10000的范围内)。给定一个大小为a乘b的小矩阵P(a和b在10的范围内)。求M的a行和b列的不同选择的总数(这将给我们一个a乘b“子矩阵”H),这样就存在一个H的行和列的排列,从而给我们一个匹配P的矩阵

我想一旦我能解决一维的问题,二维的问题就可以解决了


经过研究,我发现这是一个子图同构问题,是NP难问题。有一些算法可以有效地解决这个问题。你可以在谷歌上搜索它,看到很多关于这个问题的论文。

在阅读之后,再重新阅读这个问题(在@Charlie的建议下),我得出结论,这些答案并没有解决真正的问题。我还得出结论,我仍然不知道问题到底是什么,但如果OP的答案是我的问题并澄清了问题,那么我会回来并更好地尝试解决它。现在,我将把这个作为一个占位符

要查找字母或其他字符的匹配项,请执行以下操作:

char buf[]="this is the string to search";
int i, count=0, len;
len = strlen(buf);
for(i=0;i<len;i++)
{
    if(buf[i] == 's') count++;
}    
计数应包含出现“s”的总数,+出现“is”的总数

[编辑]
首先,请允许我对您的问题进行技术澄清,如果给定a=“AR”,B=“START”,那么解决方案将是“a”、“R”和“AR”,在本例中,所有答案都出现在B的第3和第4个字母中。是否正确?。如果是这样,那就很容易了。你可以做一些小的修改和补充,我已经做了上面。如果你对代码有疑问,我很乐意回答

第二部分是你真正的问题:搜索的效率比好,或者至少与相同-这才是真正的诀窍。如果选择最好的方法是真正的问题,那么一些谷歌搜索是正确的。因为一旦您找到并确定了解决子字符串搜索的最佳方法(效率>=KPM),那么实现将是一组简单的步骤(),可能,但不一定使用上面使用的一些相同的C组件。(我认为指针操作将比使用字符串函数更快。)但这些技术只是实现,应该始终遵循良好的设计。这里有一些谷歌搜索帮助你开始搜索。。。(您可能已经去过其中一些)





如果您选择了算法并开始实施设计后,对技术或编码建议有疑问,请发布它们。我猜这里有几个人会喜欢帮助他们使用这样一个有用的算法。

在阅读之后,再重新阅读这个问题(在@Charlie的建议下),我得出结论,这些答案并没有解决真正的问题。我还得出结论,我仍然不知道问题到底是什么,但如果OP的答案是我的问题并澄清了问题,那么我会回来并更好地尝试解决它。现在,我将把这个作为一个占位符

要查找字母或其他字符的匹配项,请执行以下操作:

char buf[]="this is the string to search";
int i, count=0, len;
len = strlen(buf);
for(i=0;i<len;i++)
{
    if(buf[i] == 's') count++;
}    
计数应包含出现“s”的总数,+出现“is”的总数

[编辑]
首先,请允许我对您的问题进行技术澄清,如果给定a=“AR”,B=“START”,那么解决方案将是“a”、“R”和“AR”,在本例中,所有答案都出现在B的第3和第4个字母中。是否正确?。如果是这样,那就很容易了。你可以做一些小的修改和补充,我已经做了上面。如果你对代码有疑问,我很乐意回答

第二部分是你真正的问题:搜索的效率比好,或者至少与相同-这才是真正的诀窍。如果选择最好的方法是真正的问题,那么一些谷歌搜索是正确的。因为一旦您找到并确定了解决子字符串搜索的最佳方法(效率>=KPM),那么实现将是一组简单的步骤(),可能,但不一定使用上面使用的一些相同的C组件。(我认为指针操作将比使用字符串函数更快。)但这些技术只是实现,应该始终遵循良好的设计。这里有一些谷歌搜索帮助你开始搜索。。。(您可能已经去过其中一些)





如果您选择了算法并开始实施设计后,对技术或编码建议有疑问,请发布它们。我猜这里有几个人会乐于帮助实现这样一个有用的算法。

如果X是Y中的子字符串,那么X的每个字符都必须在Y中。因此,我们首先遍历X,在数组中找到每个字符的计数
count