第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()函数等进行了一定的学习。如果你有任何关于本篇文章的疑问,都可以在评论区提出来,我会一一解答。明天继续加油!
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java Spring Boot properties多环境配置拆分文件管理

上文 java Spring Boot yml多环境拆分文件管理优化 我们用yml 做了一个多环境配置文件的拆分管理 我们将 application.yml 改为 application.properties 参考代码如下 spring.profiles.activedev我们知道 yml 是用 : 来区分高低基本 而 properties是直接通过 . 来表达 其他基本…

使用svd 分解的方法对神经网络模型进行压缩(能不能压缩要看秩的大小)

参考和理论 压缩原理代码 import torch import numpy as np torch.manual_seed(0)# ------------------------------------ # n:输入数据维度 # m:输出数据维度 # ------------------------------------ n = 12 m = 10# ------------------------------------ # 随机初始化权…

树形组件浅知

别人写好的轮子&#xff0c;会用即可 首先&#xff0c;需要安装依赖&#xff0c;npm install --save riophae/vue-treeselect 如果使用npm 不行 那么就使用 yarn add --save riophae/vue-treeselect 然后在使用的地方引入即可 // import the componentimport Treeselect from…

微信ipad协议8.0.40 加好友功能

友情链接 geweapi.com 点击即可访问&#xff01; 好友请求验证 小提示&#xff1a; v_3 v_4 可以参考 搜索接口 请求URL&#xff1a; http://域名地址/api/contacts/verifyuser 请求方式&#xff1a; POST 请求头&#xff1a; Content-Type&#xff1a;application/js…

SpringCloud实用篇7——深入elasticsearch

目录 1 数据聚合1.1 聚合的种类1.2 DSL实现聚合1.2.1 Bucket聚合语法1.2.2 聚合结果排序1.2.3 限定聚合范围1.2.4 Metric聚合语法1.2.5.小结 1.3 RestAPI实现聚合1.3.1 API语法1.3.2 业务需求1.3.3 业务实现 2 自动补全2.1 拼音分词器2.2 自定义分词器2.3 自动补全查询2.4 实现…

POJ 1995 Raising Modulo Numbers 快速幂

一、总结 我一开始担心溢出&#xff0c;开了一个无符号的long long&#xff0c;但是直接超时&#xff0c;后来一看它的mod不是很大&#xff0c;于是改成int&#xff0c;直接过了。 二、代码 #include <iostream> using namespace std; int H, Z; int M; int mulMod(in…

P1217 [USACO1.5] 回文质数 Prime Palindromes

P1217 [USACO1.5] 回文质数 Prime Palindromes - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) # [USACO1.5] 回文质数 Prime Palindromes ## 题目描述 因为 $151$ 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 $151$ …

Python基础教程:私有变量的访问和赋值教程

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 首先我们这里先描述下&#xff1a; Python中&#xff0c;变量名类似__x__的&#xff0c;以双下划线开头&#xff0c;并且以双下划线结尾的&#xff0c;是特殊变量&#xff0c;特殊变量是可以直接访问的&#xff08;比如 doc, __i…

SpringBoot3集成ElasticSearch

标签&#xff1a;ElasticSearch8.Kibana8&#xff1b; 一、简介 Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎&#xff0c;适用于各种数据类型&#xff0c;数字、文本、地理位置、结构化数据、非结构化数据&#xff1b; 在实际的工作中&#xff0c;历经过Ela…

南大通用数据库(gbase 8s) 在Centos7环境 集群安装

国产数据库-达梦 一、环境详情二、Centos7 参数优化&#xff08;所有节点&#xff09;三、创建gbase用户&#xff08;所有节点&#xff09;四、 安装部署&#xff0c;只在node1 安装即可同步五、数据库卸载六、数据库连接与使用 当前安装 在指定版本环境下 测试&#xff0c;仅供…

QT的设计器介绍

设计器介绍 Qt制作 UI 界面&#xff0c;一般可以通过UI制作工具QtDesigner和纯代码编写两种方式来实现。纯代码实现暂时在这里不阐述了在后续布局章节详细说明&#xff0c;QtDesigner已经继承到开发环境中&#xff0c;在工程中直接双击ui文件就可以直接在QtDesigner设计器中打…

【100天精通python】Day39:GUI界面编程_PyQt 从入门到实战(下)_图形绘制和动画效果,数据可视化,刷新交互

目录 专栏导读 6 图形绘制与动画效果 6.1 绘制基本图形、文本和图片 6.2 实现动画效果和过渡效果 7 数据可视化 7.1 使用 Matplotlib绘制图表 7.2 使用PyQtGraph绘制图表 7.3 数据的实时刷新和交互操作 7.3.1 数据的实时刷新 7.3.2 交互操作 7.4 自定义数据可视化…

C# 窗体永远在最前

C# 窗体永远在最前 1、调用系统API public const int HWND_TOP 0;public const int HWND_BOTTOM 1;public const int HWND_TOPMOST -1;public const int HWND_NOTOPMOST -2;//设置此窗体为活动窗体&#xff1a;//将创建指定窗口的线程带到前台并激活该窗口。键盘输入直接指…

【WPF】 本地化的最佳做法

【WPF】 本地化的最佳做法 资源文件英文资源文件 en-US.xaml中文资源文件 zh-CN.xaml 资源使用App.xaml主界面布局cs代码 App.config辅助类语言切换操作类资源 binding 解析类 实现效果 应用程序本地化有很多种方式&#xff0c;选择合适的才是最好的。这里只讨论一种方式&#…

Unity制作一个简单的登入注册页面

1.创建Canvas组件 首先我们创建一个Canvas画布&#xff0c;我们再在Canvas画布底下创建一个空物体&#xff0c;取名为Resgister。把空物体的锚点设置为全屏撑开。 2.我们在Resgister空物体底下创建一个Image组件&#xff0c;改名为bg。我们也把它 的锚点设置为全屏撑开状态。接…

【深入理解ES6】字符串和正则表达式

概念 字符串&#xff08;String&#xff09;是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol&#xff08;es6新增&#xff09;。 更好的Unicode支持 1. UTF-16码位 字符串里的字符有两种&#xff1a; 前 个码位均以16位的编码单元…

每日一道面试题之session 和 cookie 有什么区别?

Session和Cookie是两种在Web开发中用于跟踪用户状态的机制&#xff1a; 它们之间的区别如下&#xff1a; 存储位置&#xff1a;Cookie是存储在用户浏览器中的小型文本文件&#xff0c;而Session是存储在服务器上的数据结构。 数据安全性&#xff1a;Cookie中的数据可以被用户…

总结,由于顺丰的问题,产生了电脑近期一个月死机问题集锦

由于我搬家&#xff0c;我妈搞顺丰发回家&#xff0c;但是没有检查有没有坏&#xff0c;并且我自己由于不可抗力因素&#xff0c;超过了索赔时间&#xff0c;反馈给顺丰客服&#xff0c;说超过了造成了无法索赔的情况&#xff0c;现在总结发生了损坏配件有几件&#xff0c;显卡…

NLP | 论文摘要文本分类

基于论文摘要的文本分类与关键词抽取挑战赛​​​​​​2023 iFLYTEK A.I.开发者大赛-讯飞开放平台 环境需求&#xff1a;Anaconda-JupyterNotebook&#xff0c;或者百度AIStudio 赛题解析&#xff1a; 【文本二分类任务】根据论文摘要等信息理解&#xff0c;将论文划分为0-1两…