2023-08-28 小练习_环形字符串的某子串出现次数

2023-08-28 小练习_环形字符串的某子串出现次数_第1张图片


老林的C语言新课, 想快速入门点此


小练习_环形字符串的某子串出现次数

  • 前言
  • 一、具体算法
      • 描述
      • 输入
      • 输出
  • 二、代码
  • 总结


前言

最近看了一个提问, 问如何计算环形字符串的某子串出现次数, 其实算法比较简单, 增加在字符串结尾增加子字符串长度减一的字符即可.


一、具体算法

描述

求环形字符串中某个子串出现了几次

输入

两行:每行一个字符串;

第一行是环形字符串a

第二行是要查找的子串b

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

输出

子串出现次数

字符串"abacab", 子字符串"aba", 直接做环形好像比较难, 但其实环形比非环形多的情况就是子串b的一部分在a的末尾, 一部分在a的开头, 也就是在a后面最多补子串长度-1个字符, 这些字符来自a的头部.

见下图
2023-08-28 小练习_环形字符串的某子串出现次数_第2张图片
这样, 我们就把环形字符的子串查找变为普通字符串查找了.

二、代码

代码比较简单, 用了两个字符串函数 strncat()字符连接 和 strstr()查找子串:

#include 
#include 
#include 
 
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语言,算法,环形字符串子串查找)