日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通 2050:【例5.20】字串包含 | OpenJudge NOI 1.17 19:字符串移位包含问题

發布時間:2025/3/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通 2050:【例5.20】字串包含 | OpenJudge NOI 1.17 19:字符串移位包含问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目鏈接】

ybt 2050:【例5.20】字串包含
OpenJudge NOI 1.17 19:字符串移位包含問題

【題目考點】

1. 字符串

2. 判斷一個字符串是不是另一個字符串的子串(字符串模式匹配)

字符串模式匹配有多種算法,如:KMP、BM、Sunday、Horspool等等,如想學習,可以自行搜索。
本文只給出最基本的枚舉法,來判斷一個字符串是不是另一個字符串的子串。

  • 字符數組
bool isSubStr(char s1[], char s2[])//枚舉判斷s2是不是s1的子串 {int l1 = strlen(s1), l2 = strlen(s2);for(int i = 0; i <= l1-l2; ++i){//判斷s1從s1[i]~s1[i+l2-1]是否與s2相同 bool isSame = true;for(int j = 0; j < l2; ++j){if(s1[i+j] != s2[j]){isSame = false;break;}}if(isSame)return true;}return false; }
  • string類:
bool isSubStr(string s1, string s2)//s2是不是s1的子串 {int l1 = s1.length(), l2 = s2.length();for(int i = 0; i <= l1 - l2; ++i){if(s1.substr(i, l2) == s2)return true;}return false; }

3. 查找子串函數

c++庫函數中存在查找一個字符串在另一個字符串中出現位置的函數,該函數自然也可以用來判斷一個字符串是否是另一個字符串的子串。

  • 字符數組查找子串:<cstring>中包含函數:
    strstr (s1, s2);
    其中參數s1、s2是字符數組
    返回值:此函數返回一個指針,該指針指向s1中找到的s2的第一個字符,如果s1中不存在s2,則返回空指針。
  • string類查找子串:
    s1.find(s2)
    其中s1,s2是string類對象。
    返回值:是一個無符號整數,為s2在s1中第一次出現的位置。
    如s2不是s1的子串,那么返回string::npos(靜態變量,值為-1u或unsigned(-1))
    (find函數用法有很多,這里只給出一種)

【解題思路】

解法1 :循環遍歷并比較

先確定輸入的兩個字符串哪個更長哪個更短,設更長的為s1,更短的為s2。其中s1的長度為l1,s2的長度為l2。判斷s2是否可以是s1的子串。
嘗試從s1的每個位置出發,循環遍歷向后數l2個字符(如果到末尾,就回到第0位置繼續數),看這l2個字符和s2是否相同。如果存在相同的情況,那么s1位移包含s2,輸出true。如果不存在相同的情況,輸出false。

解法2: 構造新字符串并判斷子串

先讓s1是較長的字符串,s2是較短的字符串。s1長度l1,s2長度l2。
讓s1做l1次循環移位(每個字符向左移位一次,第0個字符移位到最后),每次得到一個新字符串s1,判斷s2是否是這個新的s1的子串。判斷一個字符串是否是另一個字符串的子串,參考【題目考點】3、4,可以用自己寫的函數,也可以用c++庫中存在函數。

【題解代碼】

解法1:循環遍歷并比較

#include<bits/stdc++.h> using namespace std; int main() {char s1[35], s2[35], t[35];cin >> s1 >> s2;int l1, l2, tl;l1 = strlen(s1);l2 = strlen(s2);bool hasSubstr = false;if(l1 < l2)//讓s1是較長的字符串,s2是較短的字符串 {//如果s1比s2短,那么二者交換 strcpy(t, s1);strcpy(s1, s2);strcpy(s2, t);l1 = strlen(s1);l2 = strlen(s2);}//l1>=l2的前提下,判斷l2是不是l1的子串 for(int i = 0; i < l1; ++i){//看l1從下標i開始到(i+l2-1)%l1是不是與s2相同,如果相同則s2是s1的子串。要循環遍歷字符數組。 bool isSubStr = true;for(int j = 0; j < l2; ++j){if(s2[j] != s1[(i+j)%l1]){isSubStr = false;break;}}if(isSubStr){cout << "true";return 0;}}cout << "false";return 0; }

解法2:構造新字符串并判斷子串

  • 字符數組
    自己寫判斷子串函數
#include<bits/stdc++.h> using namespace std; bool isSubStr(char s1[], char s2[])//枚舉判斷s2是不是s1的子串 {int l1 = strlen(s1), l2 = strlen(s2);for(int i = 0; i <= l1-l2; ++i){//判斷s1從s1[i]~s1[i+l2-1]是否與s2相同 bool isSame = true;for(int j = 0; j < l2; ++j){if(s1[i+j] != s2[j]){isSame = false;break;}}if(isSame)return true;}return false; } int main() {char s1[35], s2[35], t[35], c;cin >> s1 >> s2;int l1, l2, tl;l1 = strlen(s1);l2 = strlen(s2);if(l1 < l2)//讓s1是較長的字符串,s2是較短的字符串 {//如果s1比s2短,那么二者交換 strcpy(t, s1);strcpy(s1, s2);strcpy(s2, t);swap(l1, l2);}for(int i = 0; i < l1; ++i){if(isSubStr(s1, s2)){cout << "true";return 0;}//s1整體向左循環移位一格,s1[0]移動到最末尾 c = s1[0];for(int j = 0; j < l1 - 1; ++j)s1[j] = s1[j+1];s1[l1-1] = c;}cout << "false";return 0; }

使用strstr函數

#include<bits/stdc++.h> using namespace std; int main() {char s1[35], s2[35], t[35], c;cin >> s1 >> s2;int l1, l2, tl;l1 = strlen(s1);l2 = strlen(s2);if(l1 < l2)//讓s1是較長的字符串,s2是較短的字符串 {//如果s1比s2短,那么二者交換 strcpy(t, s1);strcpy(s1, s2);strcpy(s2, t);swap(l1, l2);}for(int i = 0; i < l1; ++i){if(strstr(s1, s2) != NULL)//判斷s2是否是s1的子串 {cout << "true";return 0;}//s1整體向左循環移位一格,s1[0]移動到最末尾 c = s1[0];for(int j = 0; j < l1 - 1; ++j)s1[j] = s1[j+1];s1[l1-1] = c;}cout << "false";return 0; }
  • 使用string類
    自己寫判斷子串函數
#include<bits/stdc++.h> using namespace std; bool isSubStr(string s1, string s2)//s2是不是s1的子串 {int l1 = s1.length(), l2 = s2.length();for(int i = 0; i <= l1 - l2; ++i){if(s1.substr(i, l2) == s2)return true;}return false; } int main() {string s1, s2;cin >> s1 >> s2;if(s1.length() < s2.length())//讓s1是較長的字符串,s2是較短的字符串 swap(s1, s2);for(int i = 0; i < s1.length(); ++i){if(isSubStr(s1, s2))//判斷s2是否是s1的子串 {cout << "true";return 0;}//s1整體向左循環移位一格,s1[0]移動到最末尾 s1.push_back(s1[0]);//將第一個字符添加到末尾 s1.erase(s1.begin());//刪除第一個字符 }cout << "false";return 0; }

使用成員函數find

#include<bits/stdc++.h> using namespace std; int main() {string s1, s2;cin >> s1 >> s2;if(s1.length() < s2.length())//讓s1是較長的字符串,s2是較短的字符串 swap(s1, s2);for(int i = 0; i < s1.length(); ++i){if(s1.find(s2) != string::npos)//判斷s2是否是s1的子串 {cout << "true";return 0;}//s1整體向左循環移位一格,s1[0]移動到最末尾 s1.push_back(s1[0]);//將第一個字符添加到末尾 s1.erase(s1.begin());//刪除第一個字符 }cout << "false";return 0; }

總結

以上是生活随笔為你收集整理的信息学奥赛一本通 2050:【例5.20】字串包含 | OpenJudge NOI 1.17 19:字符串移位包含问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线观看的网站 | 国产精品免费视频一区二区三区 | 国内自拍一区 | 日日干夜夜爱 | 琪琪五月天 | 亚洲干 | 久久理伦| 娇妻第一次尝试交换的后果 | 密臀久久 | 日韩大片在线免费观看 | 极品videosvideo喷水 | 国产在线视频不卡 | 色婷婷久久一区二区三区麻豆 | 日本一级淫片免费放 | 日本xxxx在线观看 | 国产成人自拍网站 | 成人精品视频网站 | 国产aⅴ激情无码久久久无码 | 欧美精品日韩 | 黄色av大片 | 97福利在线 | 日批免费在线观看 | 99成人在线观看 | 伊人影片| 白嫩少妇激情无码 | 国产免费一区,二区 | 国产真人毛片 | 极品粉嫩小仙女高潮喷水久久 | 成人免费片 | 中文字幕一区在线 | 久久国产成人精品 | 极品美女扒开粉嫩小泬 | 肉肉av福利一精品导航 | 经典毛片 | 福利免费在线观看 | 69精品无码成人久久久久久 | 日在线视频 | 一个人在线观看www软件 | 国产成人精品无码片区在线 | 啪啪av导航 | 亚洲最新在线视频 | 伊人午夜| 自拍偷拍p | 欧美三级一区二区 | 黑人导航| 免费av在线 | 免费在线观看av网站 | 91精品国产高清一区二区三蜜臀 | 精品国产欧美一区二区 | 色香蕉av| 亚洲视频一区二区三区四区 | 炕上如狼似虎的呻吟声 | 美女视频黄色在线观看 | 国产农村熟妇videos | 韩国毛片一区二区 | 大陆农村乡下av | 国内自拍在线 | 日韩毛片高清在线播放 | 在线看视频| 午夜草逼 | 亚洲a一区 | 三上悠亚一区二区 | 欧美熟妇精品黑人巨大一二三区 | 性――交――性――乱睡觉 | 久久国产精品视频 | 丝袜熟女一区二区三区 | 九九热视频免费 | 高清视频一区二区三区 | 在线观看自拍 | 国产69精品一区二区 | 亚洲午夜精品久久久久久app | 日韩一页 | 日日操夜夜操天天操 | 国产成人精品国内自产拍免费看 | 日韩久久久久久 | 国产高清区 | 精品中出 | 狠狠干狠狠撸 | 欧美在线视频网 | 别揉我奶头啊嗯一区二区 | 欧美视频在线免费 | 911色| av网站亚洲| 久久久国产成人一区二区三区 | 日本一区二区免费在线观看 | 美女国产一区 | 国产女主播在线 | 韩国特级毛片 | 韩日av在线播放 | 日韩美女激情视频 | 免费毛片在线 | av导航站 | a级一级片 | 精品国产一级 | 伊人网狼人 | 精品黑人一区二区三区 | 日本中文字幕精品 | 国产最新精品视频 | 激情欧美一区二区三区精品 |