老林的C语言新课, 想快速入门点此 <C 语言编程核心突破>
小练习_环形字符串的某子串出现次数
- 前言
- 一、具体算法
- 描述
- 输入
- 输出
- 二、代码
- 总结
前言
最近看了一个提问, 问如何计算环形字符串的某子串出现次数, 其实算法比较简单, 增加在字符串结尾增加子字符串长度减一的字符即可.
一、具体算法
描述
求环形字符串中某个子串出现了几次
输入
两行:每行一个字符串;
第一行是环形字符串a
第二行是要查找的子串b
数据保证字符串长度小于等于1000,且子串b长度小于等于a
输出
子串出现次数
字符串"abacab", 子字符串"aba", 直接做环形好像比较难, 但其实环形比非环形多的情况就是子串b的一部分在a的末尾, 一部分在a的开头, 也就是在a后面最多补子串长度-1个字符, 这些字符来自a的头部.
见下图
这样, 我们就把环形字符的子串查找变为普通字符串查找了.
二、代码
代码比较简单, 用了两个字符串函数 strncat()字符连接 和 strstr()查找子串:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char strA[1024];
char strB[1024];
int main()
{
scanf("%s", strA);
scanf("%s", strB);
strncat(strA, strA, strlen(strB) - 1);
const char *ptr = strA;
int cnt = 0;
while ((ptr = strstr(ptr, strB)))
{
cnt++;
ptr++;
}
printf("%d\n", cnt);
}
总结
上面代码较为简单, 同时还有一个小陷阱, 重复子串, 比如 “aaabaaa”, 子串是"aa", 有兴趣的同学可以琢磨一下.
老林的C语言新课, 想快速入门点此 <C 语言编程核心突破>