查找奶牛围成圈后组成的字符串的某个子串出现几次.

查找子串
描述

小明的字母牛们又出来吃草了,今天它们在吃草时,围成了一圈,小明就突发奇想,这些奶牛组成的字符串中某个子串出现了几次

day14-03.zip

输入
两行:每行一个字符串;

第一行是围成一圈的奶牛组成字符串a

第二行是要查找的子串b

数据保证字符串长度小于等于1000,且子串b长度小于等于a

输出
子串出现次数

输入样例 1

abcbabcb
abcba
输出样例 1

2

可以将a复制一份拼接到a后面进行判断。
代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string a,b;
    int cnt = 0;
    cin >> a;
    cin >> b;
    a += a.substr(0,b.length()-1); //将b长度-1的字符串拼接到a后面
    for(int i=0;i<a.length()-b.length();i++)
    {
        int j = 0;
        for(;j<b.length();j++)
        {
            if(a[i+j] != b[j])
                break;
        }
        if(j==b.length())
            cnt++;
    }
    cout << cnt;
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

【以下回答由 GPT 生成】

解决方案

我们可以使用字符串匹配算法来解决这个问题。其中,最常见的字符串匹配算法是KMP算法。

KMP算法的基本思想是利用已经匹配过的部分,尽量减少比较的次数。它通过一个数组next来存储模式串中每个位置的最长可匹配前缀的下一个字符的位置。具体的算法如下:

  1. 计算模式串的next数组,next[i]表示匹配到位置i之前的字符串的最长相同前后缀的长度(也可以理解为 i 之前的位置,满足 a[0]~a[i-1] = a[j-i]~a[j-1] 的最大 j)。
  2. 使用ij两个指针来分别遍历字符串和模式串,如果当前字符匹配,则ij分别向后移动一位;如果字符不匹配,则根据next数组来决定j的新位置。
  3. j移动到模式串的末尾时,说明找到了一个匹配,此时将匹配的次数加一,并更新j的新位置为next[j-1],继续下一轮匹配。

下面是具体的代码实现:



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考结合GPT4.0、文心一言,如有帮助,恭请采纳。

一个简单的代码示例
代码解析:定义一个函数 find_substring_count,该函数接收两个参数:字符串和子串。函数遍历字符串,每次取长度为子串长度的子串,然后与子串进行比较。如果相等,则计数器加一。最后,函数返回计数器的值,即子串在字符串中出现的次数。

def find_substring_count(string, substring):  
    count = 0  
    for i in range(len(string) - len(substring) + 1):  
        if string[i:i+len(substring)] == substring:  
            count += 1  
    return count  
  
string = input().strip()  # 第一行输入围成一圈的奶牛组成字符串  
substring = input().strip()  # 第二行输入要查找的子串  
  
print(find_substring_count(string, substring))