查找子串
描述
小明的字母牛们又出来吃草了,今天它们在吃草时,围成了一圈,小明就突发奇想,这些奶牛组成的字符串中某个子串出现了几次
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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!【以下回答由 GPT 生成】
我们可以使用字符串匹配算法来解决这个问题。其中,最常见的字符串匹配算法是KMP算法。
KMP算法的基本思想是利用已经匹配过的部分,尽量减少比较的次数。它通过一个数组next
来存储模式串中每个位置的最长可匹配前缀的下一个字符的位置。具体的算法如下:
i
和j
两个指针来分别遍历字符串和模式串,如果当前字符匹配,则i
和j
分别向后移动一位;如果字符不匹配,则根据next
数组来决定j
的新位置。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))