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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【牛客网】马三来刷题之串的模式匹配

發布時間:2023/12/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【牛客网】马三来刷题之串的模式匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://www.nowcoder.com/practice/084b6cb2ca934d7daad55355b4445f8a?tpId=49&tqId=29363&rp=1&ru=/ta/2016test&qru=/ta/2016test/question-ranking


串的模式匹配
  • 熱度指數:977時間限制:3秒空間限制:32768K
  • 本題知識點:?編程基礎?字符串
  • ?算法知識視頻講解

題目描述

對于兩個字符串A,B。請設計一個高效算法,找到B在A中第一次出現的起始位置。若B未在A中出現,則返回-1。

給定兩個字符串AB,及它們的長度lenalenb,請返回題目所求的答案。

測試樣例: "acbc",4,"bc",2 返回:2

想要簡單的通過這道題非常簡單,直接用STL的find方法或者Java中IndexOf函數就可以了,但是如果要是面試的時候或者真正在線筆試的時候這么寫的話就比較慘了,面試官一定會讓你重新用KMP寫一遍~ ?這道題主要考察的是KMP算法的使用。

先來看一下之前說的一行通過的代碼:

int findAppearance(string A, int lena, string B, int lenb) {A.find(B); }
另一種借助了string 的substr方法通過的代碼,就是簡單的從頭開始枚舉:

int findAppearance(string A, int lena, string B, int lenb) {for(int i=0;i<=lena-lenb;i++){string tmp=A.substr(i,lenb);if(tmp.compare(B)==0)return i;}return -1; }
KMP算法:

vector<int> Getnext(string p){int k=-1;int j=0;vector<int> next(500);int plen=p.size();next[0]=-1;while(j < plen-1){if(k ==-1 || p[k] == p[j]){k++;j++;next[j]=k;}else{k=next[k];}}return next;}int kmpsearch(string s,string p,vector<int> nex){int i=0;int j=0;int slen=s.size();int plen=p.size();while(i < slen && j< plen){if(j == -1 || s[i] == p[j]){i++;j++;}else{j=nex[j];}}if(j == plen){return i-j;}else{return -1;}}int findAppearance(string A, int lena, string B, int lenb) {vector<int> nextB=Getnext(B);return kmpsearch(A,B,nextB);}

每天一道題,保持新鮮感,就這樣~

總結

以上是生活随笔為你收集整理的【牛客网】马三来刷题之串的模式匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

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