首页 > 其他分享 >字符串匹配/查找字符串中子串存在次数/出现位置下标 问题----- {1.[find] 2.[substr] 3.[kmp]}

字符串匹配/查找字符串中子串存在次数/出现位置下标 问题----- {1.[find] 2.[substr] 3.[kmp]}

时间:2024-03-17 16:58:55浏览次数:27  
标签:string int res ++ ne substr ----- 字符串 include

下文将介绍三种方法,求解问题类型:

1. 子串在主串中出现次数
2. 子串在主串中每次出现的下标位置

以此题为例:
在这里插入图片描述
题目链接:https://www.luogu.com.cn/problem/P8195


解法一:kmp
#include<iostream>
#include <string>
using namespace std;
const int N = 1e6 + 10;
int ne[N];
string p("chuanzhi"),t;

void getNext() {
	int m = p.length();
	int j = 0,k = -1;
	ne[0] = -1;
	while(j < m) {
		if(k == -1 || p[j] == p[k]) {
			ne[++j] = ++k;
		} else {
			k = ne[k];
		}
	}
}

int kmp() {
	int i = 0,j = 0,r = 0;
	int n = t.length(),m = p.length();
	while(i < n) {
		if(j == -1 || p[j] == t[i]) {
			i++;
			j++;
		} else {
			j = ne[j];
		}
		if(j == m) {
			r++;
			j = ne[j];
		}
	}
	return r;
}
int main()
{
	cin >> t;
	getNext();
	int res = kmp();
	printf("%d",res);
	return 0;
} 
解法二:find
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	string s;
	cin >> s;
	string tt = "chuanzhi";
	int res = 0, i = 0;
	while(s.find(tt, i) != -1) {
		res++;
		i = s.find(tt, i) + 1;
	}
	cout << res;
	return 0;
} 
解法三:substr
#include <iostream>
#include <string>
using namespace std;
int main() {
	string s, t("chuanzhi");
	cin >> s;
	int ls = s.size(), lt = t.size();
	int cnt = 0;
	for(int i = 0; i <= ls - lt; i++) {
		if(s.substr(i, lt) == t)
			cnt++;
	}
	cout << cnt;
	
	return 0;
}
补充: count()

查找在字符串 / 数组中,元素(字符/数值)出现的次数

例如
#include <algorithm>	//头文件
string s;
char c;
要查找在 s 中 c 的出现次数
则:
res = count(s.begin(), s.end(), c)

标签:string,int,res,++,ne,substr,-----,字符串,include
From: https://blog.csdn.net/m0_72256122/article/details/136784953

相关文章

  • CentOS上安装Docker Compose-记录
    在CentOS上安装DockerCompose通常涉及下载其二进制文件并将其设置为可执行文件。这个过程假设你已经安装了Docker。如果还没安装Docker,请先进行安装。以下是安装DockerCompose的步骤:1.**打开终端**:首先,打开你的终端。2.**下载DockerCompose**:使用`curl`命令下载Docke......
  • c语言程序设计--实验报告一
    实验项目名称:实验一熟悉C语言运行环境实验项目类型:验证性实验日期:2023年3月14日一、实验目的下载安装Devc6.0程序。了解在该系统上如何进行编辑、编译、连接和运行一个C程序。通过运行简单的C程序了解C程序的特点。二、实验硬、软件环境Windows计算机、Devc6.0三、......
  • 【MyBatis-Plus】最优化持久层开发 快速入门 核心功能介绍与实战 3.5.3.1
    文章目录一、简介二、快速入门三、MyBatis-Plus核心功能3.1基于Mapper接口CRUD3.1.1Insert方法3.1.2Delete方法3.1.3Update方法3.1.4Select方法3.1.5自定义和多表映射3.2基于Service接口CRUD3.2.1对比Mapper接口CRUD区别:3.2.2使用Iservice接口方式3.2.3CRUD方......
  • 【Java面试题-基础知识03】Java线程连环问
    1、Java中的线程是什么?在Java中,线程是程序执行流的最小单元。每个Java程序都至少有一个主线程,也称为主执行线程,它是程序开始执行时自动创建的。除了主线程外,程序员还可以创建额外的线程来执行并发任务。2、创建线程的方式有哪些?Java中的线程由java.lang.Thread类表示,可以通过两......
  • 力扣周赛第01弹----思维 与 dp
    力扣周赛第01弹----思维与dp一、成为K特殊字符串需要删除的最少字符数题目给你一个字符串word和一个整数k。如果|freq(word[i])-freq(word[j])|<=k对于字符串中所有下标i和j都成立,则认为word是k特殊字符串。此处,freq(x)表示字符x在word中的出现频......
  • C++20新特性-barrier
     以下内容由豆包大语言模型生成,内容仅供参考: C++20引入了一个新的标准库头文件 <barrier>,其中包含了对屏障(barrier)的支持。屏障是一种用于同步多个线程的同步原语,它允许线程在某个点上等待,直到所有线程都到达该点。C++20的 <barrier> 头文件提供了一个 std::barrier......
  • sessionInfo()使用技巧--是否事先library()的影响
    在没有使用对应R包的状态下使用命令sessionInfo(),不会显示该R包信息在使用对应R包的状态下使用命令sessionInfo(),会显示该R包及其关联R包的版本状态未library(ggplot2)时:sessionInfo()library(ggplot2)时:library(ggplot2)sessionInfo()......
  • 【经验】关于c++11中string类型字符串和整形相互转化的用法
    https://blog.csdn.net/Elephant_King/article/details/129225134 c++11中为我们提供了许多非常方便的函数,可以帮助我们在整形与string类型字符串进行转换关于Dev-c++如何使用c++11,因为本人是mac系统,使用cLion,无法安装Dev,可以在网上搜其他教程实现整形转字符串(to_string())to_s......
  • 常见排序算法(C/C++)--- 动画演示
        本篇将介绍一些常见的排序算法,如插入排序:直接插入排序、希尔排序;选择排序:选择排序、堆排序;交换排序:快速排序、冒泡排序;以及最后的归并排序。    对于以上的排序算法,我们总结了每种排序算法的特性,接着对直接插入排序进行了优化;然后实现了归并排序和快速排......
  • 项目管理工具maven(五)-私服
    4.maven私服架构 4.1maven私服介绍    4.1.1私服介绍正式开发,不同的项目组开发不同的工程。maven-dao工程开发完毕,发布到私服maven-service从私服下载dao。公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内部的maven远程仓库,......