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

news2024/11/20 9:22:19

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

在这里插入图片描述


一、小试牛刀:

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

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

输出格式

  • 若第一个串 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;
	else
		cout<<"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.coloradmin.cn/o/897901.html

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

相关文章

前端:VUE2中的父子传值

文章目录 一、背景什么是父子传值二、业务场景子传父1、在父页面中引入子页面2、子传父&#xff1a;父组件标识3、子传父&#xff1a;子组件标识 父传子父组件调用子组件中的方法 总结&#xff1a; 一、背景 最近做项目中需要使用到流工作&#xff0c;在这里流工作需要用到父子…

GM65二维码识别模块+命令控制

简介 MG65 条码识读模块&#xff0c;一款性能优良的扫描引擎&#xff0c;不仅能够轻松读取各类一维条码&#xff0c;而且可以高速读取二维条码&#xff0c;对线性条形码具有非常高的扫描速率&#xff0c;针对纸质条码及显示屏上的条码&#xff0c;也都能轻松扫描。 一、模块参…

【云原生】kubernetes应用程序包管理工具Helm

Helm 什么是 Helm 安装 Helm 重要概念 使用 Helm 1 简介 官网地址: Helm Helm是一个Kubernetes应用程序包管理工具&#xff0c;它允许你轻松管理和部署Kubernetes应用程序。Helm通过使用称为Charts的预定义模板来简化Kubernetes应用程序的部署和管理。Chart包含了一组Ku…

YOLOv5算法改进(2)— 添加SE注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。注意力机制是近年来深度学习领域内的研究热点&#xff0c;可以帮助模型更好地关注重要的特征&#xff0c;从而提高模型的性能。注意力机制可被应用于模型的不同层级&#xff0c;以便更好地捕捉图像中的细节和特征&#xff…

LeetCode_动态规划_困难_1388.3n 块披萨

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个披萨&#xff0c;它由 3n 块不同大小的部分组成&#xff0c;现在你和你的朋友们需要按照如下规则来分披萨&#xff1a; 你挑选任意一块披萨。Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。…

使用metasploit(MSF)对windows的ms17-010漏洞进行利用

主机发现 Ping扫描-禁用端口扫描 nmap -sn 192.168.1.0/24 ─# nmap -sn 192.168.1.0/24 Starting Nmap 7.93 ( https://nmap.org ) at 2023-08-14 10:00 EDT Nmap scan report for 192.168.1.1 Host is up (0.0053s latency). MAC Address: FC:BC:D1:C7:2F:A8 (Huawei Te…

SystemVerilog interface使用说明

1. Interface概念 System Verilog中引入了接口定义&#xff0c;接口与module 等价的定义&#xff0c;是要在其他的接口、module中直接定义&#xff0c;不能写在块语句中&#xff0c;跟class是不同的。接口是将一组线捆绑起来&#xff0c;可以将接口传递给module。 2. 接口的优…

Mysql性能优化:什么是索引下推?

导读 索引下推&#xff08;index condition pushdown &#xff09;简称ICP&#xff0c;在Mysql5.6的版本上推出&#xff0c;用于优化查询。 在不使用ICP的情况下&#xff0c;在使用非主键索引&#xff08;又叫普通索引或者二级索引&#xff09;进行查询时&#xff0c;存储引擎…

同一个区域多景影像使用同一个拉伸色带显示

问题描述 现需要对11景某一个区域的NDVI数据进行出图&#xff0c;且需要使用同一个拉伸的色带&#xff0c;但是拉伸色带的间断值是根据影像的直方图确定的&#xff0c;意味着11景影像会有11个不同的拉伸色带&#xff0c;不符合需求。 解决方法 目前想到的解决方法就是将11景…

稚晖君人形机器人问世:大模型加持,会自己换胳膊,要上生产线造车

从零开始,不到半年就造出人形机器人,还自带软硬件体系。 大模型技术的新一波浪潮:具身智能,已经有了重要进展。 刚刚,稚晖君的创业公司「智元机器人」开了自己的第一场发布会。 以「天才少年」身份加入华为的稚晖君(彭志辉)于去年底宣布离职创业,人们都在关注他在机器…

类的访问限定符,实例化,对象存储方式,this指针

目录 类的定义 类的两种定义方式&#xff1a; 访问限定符 类的实例化 类对象的存储方式 this指针 C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。比如&#xff1a; 之前在数据结构初阶中&#xff0c;用C语…

c++11 标准模板(STL)(std::basic_stringbuf)(七)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allocator<CharT> > class basic_stringbuf : public std::basic_streambuf<CharT, Traits> std::basic_stringbu…

SRE方法论之服务质量目标

为了量化客户对服务可靠性的期望&#xff0c;找到客户对可靠性满意的点&#xff0c;我们需要制定针对用户的服务质量目标&#xff0c;并且努力去达到这个质量目标。在这个过程中&#xff0c;我们需要定义一些服务质量指标&#xff08;SLI&#xff09;、服务质量目标&#xff08…

上半年巴比食品增收不增利,下半年失速的团餐业务能否“复苏”?

随着生活节奏逐渐加快&#xff0c;“宅经济”和“懒人经济”快速融合&#xff0c;人们对进餐便利性的要求逐渐提高&#xff0c;更适用于居家消费的食品应运而生&#xff0c;这其中速冻面点既便于烹饪&#xff0c;又方便快捷&#xff0c;因此其率先出圈获得了消费者青睐&#xf…

SparkSQL源码分析系列03-Antlr4分析测试

SparkSQL主要通过Antlr4定义SQL的语法规则&#xff0c;完成SQL词法&#xff0c;语法解析&#xff0c;最后将SQL转化为抽象语法树。所以有必要先了解下Antlr4的工作流程。 ANTLR4是什么&#xff1f; ANTLR 是 ANother Tool for Language Recognition 的缩写&#xff0c;官网&a…

Python:逢七拍腿游戏

场景模拟&#xff1a; 通过在 for 循环中使用 continue 语句实现计算拍腿次数&#xff0c;即计算从1到100&#xff08;不包括100&#xff09;&#xff0c;一共有多少个尾数为7或7的倍数这样的游戏&#xff0c;代码如下&#xff1a; total 99 # 记…

解读李子园2023上半年财报:营收净利双增,未来持续聚焦大单品?

时至今日&#xff0c;饮料界已经分化出了诸多新品类&#xff0c;无糖气泡水、功能饮料、碳酸饮料、茶饮料、含乳饮料等等层出不穷&#xff0c;令人眼花缭乱。这一现象促使全行业产品都在向多样化转变&#xff0c;其中乳制品的结构分化尤为明显。 然而&#xff0c;身处“局中”…

AB跳转轮询:让你的独立站收款智能化

独立站在近两年成为跨境电商的热门布局之一&#xff0c;特别是在亚马逊封号潮后&#xff0c;许多卖家开始转向独立站运营。然而&#xff0c;在迅速发展的同时&#xff0c;也不可避免地出现了一些问题&#xff0c;比如很多卖家的资金经常被不同程度地冻结&#xff0c;好不容易出…

AI问答:JSBridge / WebView 与 Native 通信

一、理解JSBridge JSBridge是一种连接JavaScript和Native代码的桥梁&#xff0c;它提供了一种方法&#xff0c;使得JavaScript可以直接调用Native的代码&#xff0c;同时使得Native的代码也能直接调用JavaScript的方法&#xff0c;从而实现了JavaScript和Native之间的相互调用和…

GNN学习笔记

GNN b站课程跳转------->>>>> 【不愧是公认最好的【图神经网络GNN/GCN教程】&#xff0c;从基础到进阶再到实战&#xff0c;一个合集全部到位&#xff01;-人工智能/神经网络/图神经网络/深度学习。】 https://www.bilibili.com/video/BV1184y1x71H/?share_so…