第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.pswp.cn/news/42823.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42823.shtml
英文地址,請注明出處:http://en.pswp.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兩…