日韩性视频-久久久蜜桃-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:字符串移位包含问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: av一区二区在线播放 | 日韩免费播放 | 亚洲成人三区 | 91精品国产乱码久久久 | 色综合久久88色综合天天免费 | 绿色地狱在线观看 | 91香蕉视频在线观看免费 | 国产精品对白刺激久久久 | 亚洲欧美激情在线观看 | 欧美精品日韩在线观看 | 91精品久久久久久久久久久 | 黄频在线观看 | 中文av一区 | 熟妇人妻中文字幕无码老熟妇 | 婷婷五月综合激情 | 亚洲精品77777 | 最新av | 打屁股黄文 | 欧亚一区二区 | 一级黄色录象 | 久久人妻少妇嫩草av无码专区 | 欧美日韩一区在线 | 国产精品久久久久久久久久 | 国产xxxx在线 | 国产一区视频在线免费观看 | 视色影院| 欧美日韩欧美日韩在线观看视频 | 在线看日本 | 色欲人妻综合网 | 三级免费看 | 蜜桃成人在线观看 | 精品人妻一区二区三区视频 | 日本高清视频www夜色资源 | 欧美a级成人淫片免费看 | 日本体内she精高潮 男女视频在线免费观看 | 中文字幕日韩人妻在线视频 | 中文av网| 日韩欧美亚洲国产 | 国产真实乱人偷精品人妻 | 亚洲国产成人综合 | 蜜乳av一区 | 久久婷婷综合国产 | 国产精品播放 | 有码在线播放 | 中国特级黄色大片 | 久久精品人妻av一区二区三区 | av日韩在线免费观看 | 午夜一级视频 | 亚洲一区国产 | 狠狠的日 | 国产真人做爰视频免费 | 人妻va精品va欧美va | 美日韩三级 | 精品无码免费视频 | 久久中文字幕无码 | 亚洲天堂一区二区在线观看 | 完美搭档在线观看 | 魔女鞋交玉足榨精调教 | 69视频网址 | 中文字幕淫 | 午夜成年人视频 | 婷婷久草| 丰满人妻一区二区三区大胸 | 女女互慰揉小黄文 | 亚洲精品在线视频观看 | av第一页 | 骑骑上司妻电影 | 2023国产精品| 伊人久久国产 | 97超碰资源总站 | 樱花视频在线观看 | 好男人网站 | a级国产毛片 | 毛片毛片 | 一级全黄少妇性色生活片 | 四虎影库 | 一区二区网站 | 国产综合在线播放 | 日韩怡春院 | 欧美日韩中文字幕在线 | 自拍偷拍精品视频 | 国产探花精品在线 | 亚洲一区在线观看视频 | 男生裸体视频网站 | 国产伦精品一区二区三区千人斩 | 美女伦理水蜜桃4 | 在线看国产视频 | 日本一区二区精品视频 | 国产无遮挡a片又黄又爽 | 久久综合88 | 欧美激情综合色综合啪啪五月 | 日韩av中文字幕在线播放 | 一区二区在线精品 | 日韩精品中文字幕一区二区三区 | 成年人在线免费 | 国产精品久久毛片av大全日韩 | 中文字幕欧美专区 | 在线视频天堂 | a毛片成人 |