【牛客网】马三来刷题之串的模式匹配
生活随笔
收集整理的這篇文章主要介紹了
【牛客网】马三来刷题之串的模式匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接: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。
給定兩個字符串A和B,及它們的長度lena和lenb,請返回題目所求的答案。
測試樣例: "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);}
每天一道題,保持新鮮感,就這樣~
總結
以上是生活随笔為你收集整理的【牛客网】马三来刷题之串的模式匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAC打开outlook提示”正在修复
- 下一篇: Omni-ID 推出2款有源RFID标签