当前位置: 首页 > news >正文

第1天----验证一个字符串是否是另一个字符串的子串

本文我们将学习如何去验证一个字符串是否是另一个字符串的子串。

在这里插入图片描述


一、小试牛刀:

题目描述
输入两个字符串,验证其中一个串是否为另一个串的子串。

输入格式
两行,每行一个字符串。

输出格式

  • 若第一个串 s 1 是第二个串 s 2 的子串,则输出(s1) is substring of (s2);

  • 否则,若第二个串 s 2是第一个串 s 1的子串,输出(s2) is substring of (s1);

  • 否则,输出 No substring。

输入输出样例:
输入 1
abc
dddncabca
输出 1
abc is substring of dddncabca
输入2
aaa
bbb
输出 2
No substring
说明/提示:
对于 100%的数据,字符串长度在 20 以内。


方法一:

直接按照题目的思路来实现

  • 此方法虽然代码量大,但并不难想,完全是按照题目的要求来实现,所以不做过多解释。
#include<iostream>
#include<string>
using namespace std;void substring(string s1, string s2,int len1,int len2,int min)
{int flag = 0;if (min == len1){int k = 0;for (int i = 0; i < len2; i++){int cnt = 0;for (int j = 0; j < min; j++){if (s1[j] == s2[k]){cnt++;k++;}else break;}if (cnt == min) { flag = 1; break; }else flag = -1; k = i;}}else{int k = 0;for (int i = 0; i < len1; i++){int cnt = 0;for (int j = 0; j < min; j++){if (s2[j] == s1[k]){cnt++;k++;}else break;}if (cnt == min){ flag = 0; break; }else  flag = -1; k = i;}}if (flag == -1) cout << "No substring" << endl;else if(flag==0)  cout << s2 << " is substring of " << s1 << endl;else cout << s1 << " is substring of " << s2 << endl;}int main(void)
{string s1,s2;cin >> s1 >> s2;int len1 = s1.length();int len2 = s2.length();	int min= len1 <= len2 ? len1 : len2;substring(s1, s2,len1,len2,min);return 0;
}

方法二:

利用cstring 库中的 strstr 函数查找:

可以先用字符数组存字符串,然后查找子串可以使用 cstring 库中的 strstr 函数,未找到时返回 NULL。 先查找 b 是否是 a的子串,再查找a是否是 b 的子串。如果都不是,输出 "No substring"

  • 代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{char a[25],b[25];cin>>a>>b;if(strstr(a,b)!=NULL)cout<<b<<" is substring of "<<a;else if(strstr(b,a)!=NULL)cout<<a<<" is substring of "<<b;elsecout<<"No substring";return 0;
}

方法三:

利用 string 库里的函数来实现。

比如此时我们有一个 string 类型的变量 strstring str="hello world";
然后我们可以调用find函数来在 str中寻找是否含有子串"hello"str.find("hello")
如果该函数的返回值为str.npos(表示无效),则表示在 str 中不存在该子串,否则存在。

  • 代码如下:
#include <iostream>
#include <string>
using namespace std;
string a,b;
int main()
{cin>>a>>b;if(a.find(b)!=a.npos)    //如果b是a的子串 {cout<<b<<" is substring of "<<a<<endl;}else if(b.find(a)!=b.npos)   //如果a是b的子串 {cout<<a<<" is substring of "<<b<<endl;}else      //如果没有子串关系 {cout<<"No substring"<<endl;}return 0;
}

方法四:

使用C++string库中的std::find()函数也可以实现字符串的查找操作(此方法和方法三有点类似)
std::find()函数可以在一个字符串中查找另一个字符串的第一次出现的位置

  • 注意find函数若未找到的返回值为string::npos

代码如下:

#include<bits/stdc++.h>//万能头
using namespace std;
string a,b;
int main(){cin>>a>>b;if(b.find(a)!=string::npos) cout<<a<<" is substring of "<<b;//a是b的子串else if(a.find(b)!=string::npos) cout<<b<<" is substring of "<<a;//b是a的子串else cout<<"No substring";return 0;
}

二、拓展讲解:

1. strstr()函数:

strstr函数是C语言中的字符串处理函数,用于在一个字符串中查找另一个字符串的第一次出现的位置。它的原型如下:

char *strstr(const char *haystack, const char *needle);

其中,参数haystack是源字符串,参数needle是要查找的目标字符串。

  • 函数的返回值是一个指向找到的目标字符串在原字符串中的首个字符的指针。如果未找到目标字符串,则返回NULL。

以下是一个使用strstr函数的例子:

#include <stdio.h>
#include <string.h>int main() {char str1[] = "Hello, world!";char str2[] = "world";char *result;result = strstr(str1, str2);if (result != NULL) {printf("'%s' found in '%s' at position %ld\n", str2, str1, result - str1);} else {printf("'%s' not found in '%s'\n", str2, str1);}return 0;
}

输出结果为:

'world' found in 'Hello, world!' at position 7
  • 这个例子中,strstr函数找到了字符串"world"在字符串"Hello, world!"中的位置,并返回了指向该位置的指针。

2. std::find()函数:

C++中的string库中的std::find()函数也可以在一个字符串中查找另一个字符串的第一次出现的位置。并且std::string::find()函数会返回一个位置索引,如果找不到子串,则返回std::string::npos

  • 在C++中,std::string::npos是一个特殊的静态成员变量,它表示字符串中不存在指定的子串。
#include <iostream>
#include <string>
#include <algorithm>int main() {std::string str1 = "Hello, world!";std::string str2 = "world";std::size_t found = str1.find(str2);if (found != std::string::npos) {std::cout << "'" << str2 << "' found in '" << str1 << "' at position " << found << std::endl;} else {std::cout << "'" << str2 << "' not found in '" << str1 << "'" << std::endl;}return 0;
}

输出结果为:

'world' found in 'Hello, world!' at position 7
  • 这个例子中,std::find()函数找到了字符串"world"在字符串"Hello, world!"中的位置,并返回了该位置的索引。如果未找到目标字符串,则返回std::string::npos

3. 域解析符:

  • 聪明的你可能已经发现了,上面的方法三和方法四其实是一样的,而这将关系到作用域的问题。

域解析符(Scope resolution operator)是C++中的一个运算符,用于访问命名空间、类、结构体、枚举等作用域内的成员。

  • 域解析符使用两个冒号::表示,语法形式为命名空间名::成员名或类名::成员名。

以下是一些使用域解析符的示例:

  1. 访问命名空间的成员
namespace MyNamespace {int value = 10;
}int main() {std::cout << MyNamespace::value << std::endl;return 0;
}

  1. 访问类的静态成员
class MyClass {
public:static int value;
};int MyClass::value = 20;int main() {std::cout << MyClass::value << std::endl;return 0;
}

  1. 访问类的成员函数
class MyClass {
public:void printHello() {std::cout << "Hello" << std::endl;}
};int main() {MyClass obj;obj.printHello();return 0;
}
  • 在上述示例中,域解析符用于访问命名空间的成员、类的静态成员和类的成员函数。它可以帮助我们在不同的作用域中访问到所需的成员。

因此,a.find(b) != a.npos的判断条件也是正确的(a.npos其实就等同于string::npos),它用于判断字符串a中是否存在子串b。如果子串b存在于字符串a中,a.find(b)的返回值不等于std::string::npos,条件成立;否则,条件不成立。


  • 好了,今天的讲解就到这里了。我们今天主要学习了如何验证一个字符串是否是另一个字符串的子串,并对strstr(),std::find()函数等进行了一定的学习。如果你有任何关于本篇文章的疑问,都可以在评论区提出来,我会一一解答。明天继续加油!
    在这里插入图片描述

相关文章:

第1天----验证一个字符串是否是另一个字符串的子串

本文我们将学习如何去验证一个字符串是否是另一个字符串的子串。 一、小试牛刀&#xff1a; 题目描述 输入两个字符串&#xff0c;验证其中一个串是否为另一个串的子串。 输入格式 两行&#xff0c;每行一个字符串。 输出格式 若第一个串 s 1 是第二个串 s 2 的子串&#xff0c…...

项目实战第四十三讲:使用模版模式优雅实现财务编辑费用

项目实战第四十三讲:财务编辑费用 本文是项目实战第43讲:使用模版模式优雅实现财务编辑费用。支持查看司机填写费用信息,并且附件管理支持展示司机上传费用照片。 文章目录 项目实战第四十三讲:财务编辑费用1、项目背景2、主要技术3、项目职责4、项目实现4.1、表结构4.2、流…...

[JavaWeb]【六】web后端开发-请求响应

前言&#xff1a;请求响应 目录 一 引子 二 请求 2.1 Postman 2.1.1 安装 2.1.2 创建工作空间 2.1.3 添加接口 2.2 简单参数 2.2.1 原始方式&#xff08;不推荐&#xff09; 2.2.2 SpringBoot方式-GET(参数名与形参变量名相同) 2.2.3 SpringBoot方式-POST(参数名与形参…...

uniapp websocket机制 心跳 重连

在开发程序过程中通信功能还是比较常用到的&#xff0c;本文主要介绍的是uniapp中websocket的使用 websocket建立连接后&#xff0c;断开、心跳机制重新链接的一个过程。 关于uni.connectSocket可仔细阅读uniapp官网中的uni.connetSocket以及连接socket创建的实例SocketTask …...

labelme安装以及标注自己的目标检测数据集

目录 一、labelme安装指令 二、使用教程 三、 快捷键 一、labelme安装指令 winR之后在弹出的对话框中输入cmd按回车进入终端 conda activate 虚拟环境名称 pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple/ 二、使用教程 安装成功之后在终端输入label…...

归并排序JS

当然&#xff0c;下面是使用JavaScript编写的归并排序的示例代码。归并排序是一种分治算法&#xff0c;其基本思想是将数组分成两半进行排序&#xff0c;然后将排序后的结果合并在一起。 function mergeSort(arr) {if (arr.length < 1) {return arr;}const middle Math.fl…...

matlab 计算点云平均密度

目录 一、算法原理二、代码实现三、结果展示四、C++版计算结果本文由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 采样设备不同、设备距离场景远近不同,会使点云密度产生差异。现有的对点云密度的估算方法有基…...

c++ | uint8_t、uint16_t、unint32_t 和size_t

头文件 #include <stdint.h> // for C #include <cstdint> // for Cuint8_t、uint16_t、unint32_t 这三个分别是表示无符号整型&#xff0c;不同点是他们的长度不同&#xff0c;分别是8位机器位、16、32&#xff0c;也就是一个字节、两个字节、四个字节 注意在…...

mysql 超大 sql 文件导入过程

问题 最近遇到 2 个超大 sql 文件导入&#xff0c;好一通折腾 文档在哪里 调优参数太多&#xff0c;文档都看不过来 找到这些参数也费劲, ubuntu 在 /etc/mysql/mysql.conf.d/mysqld.cnf 中找到这个链接 ...... # # The MySQL Server configuration file. # # For explanat…...

【悬挂绝缘子的串效模型】测量每个绝缘子盘之间的电压并测量串效研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

P3957 [NOIP2017 普及组] 跳房子

题目背景 NOIP2017 普及组 T4 题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏&#xff0c;也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下&#xff1a; 在地面上确定一个起点&#xff0c;然后在起点右侧画 nn 个格子&#xff0c;这些…...

VR数字工厂多元化展现,打造数字企业工厂名片

5G时代&#xff0c;各种营销都在走数字化的路子&#xff0c;VR数字工厂用VR赋能工厂数字升级&#xff0c;将企业环境、工厂生产、产品研发、质检运输等流程&#xff0c;无死角720度的展示在客户面前&#xff0c;不仅可以提升自身企业的实力&#xff0c;还可以提高客户的信任感。…...

uniapp封装组件,选中后右上角显示对号√样式(通过css实现)

效果&#xff1a; 一、组件封装 1、在项目根目录下创建components文件夹&#xff0c;自定义组件名称&#xff0c;我定义的是xc-button 2、封装组件代码 <template><view class"handle-btn"><view :class"handleIdCode 1 ? select : unSelec…...

华为OD面试(部分)

笔试与性格测验 一面 问题和算法题都挺简单的 二面 Java内存泄漏 算法题思路不对&#xff0c;没写完只说了下思路&#xff1a;Leetcode516. Longest Palindromic Subsequence hr面&#xff08;资面&#xff09; 最后告诉我hr面挂了。其实这不是最重要的&#xff0c;因为还…...

从零做软件开发项目系列之一综论软件项目开发

1 引言 有一个三个泥瓦匠的故事。 三个泥瓦匠在砌墙&#xff0c;一个人走过来&#xff0c;问他们在干什么。   第一个泥瓦匠没好气地说&#xff0c;你没看见吗&#xff1f;我在辛苦地砌墙呢。   第二个回答&#xff0c;我们正在建一座高楼。   第三个则洋溢着喜悦说&…...

msvcp110.dll是什么意思,msvcp110.dll丢失的解决方法

装好软件或游戏之后&#xff0c;一打开就跳出各种报错信息的情况小伙伴一定见过&#xff0c;其中缺少各种msvcp110.dll文件最常见。小伙伴们一定奇怪&#xff0c;用得好好的电脑&#xff0c;怎么会缺文件呢&#xff1f;为啥其他游戏/应用就没事呢&#xff1f;其实这些“丢失”的…...

【报错】git push --set-upstream origin XXXX重名

您在尝试将分支推送到远程仓库时遇到了错误。错误信息表明&#xff0c;由于已经存在名为 refs/heads/xingfan/demo 的文件夹&#xff0c;Git 无法创建分支 refs/heads/xingfan。 要解决此问题&#xff0c;您可以尝试重命名本地分支&#xff0c;然后将其推送到远程仓库。以下是…...

探索树算法:C语言实现二叉树与平衡树

探索树算法&#xff1a;C语言实现二叉树与平衡树 树是计算机科学中一个重要且广泛应用的数据结构&#xff0c;它在许多领域都有着重要作用。本篇博客将深入介绍两种常见的树算法&#xff1a;二叉树遍历和平衡二叉树&#xff08;AVL树&#xff09;&#xff0c;并提供在C语言中的…...

Ubuntu 20.04(服务器版)安装 Anaconda

0、Anaconda介绍 Anaconda是一个开源的Python发行版本&#xff0c;包含了包括Python、Conda、科学计算库等180多个科学包及其依赖项。因此&#xff0c;安装了Anaconda就不用再单独安装CUDA、Python等。 CUDA&#xff0c;在进行深度学习的时候&#xff0c;需要用到GPU&#xf…...

IDEA项目实践——JavaWeb简介以及Servlet编程实战

系列文章目录 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践——Spring当…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...