【Leetcode】【Easy】Implement strStr()

Implement strStr().

Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

?

解題:

本題為典型的KMP算法考察題,KMP算法描述為:

  設主串S,匹配串P,i為S的索引下標,j為P的索引下標,初始i和j設置為0。

  在i小于S的長度和j小于P的長度時,開始循環:

  1、比較S[i]和P[j]是否相同;

  2、如果相同則i++,j++,返回執行第1步;

  3、如果不同,則計算已匹配成功的P[0]~P[j-1]中,相同前綴和后綴的最大長度,設為n;

  4、令i不變,j為n(指向相同前后綴的后一個字符),返回執行第1步;

  循環結束時,查看j值是否等于P的長度,如果等于則匹配成功,否則主串中不包含匹配串。

計算最長相同前后綴:

  新建一個數組a,數組長度為匹配串P長度。數組的每一位a[i],表示由P[0]~P[i]表示的字符串,最長相同前后綴的位數;

  a[0]初始化為0,令i為1,j為0,對于a[i](0<i<len)有兩種情況:

  1、如果P[j] == P[i],那么a[i] = a[i - 1] + 1;

    ?接著j++,i++重新執行第一步;

  2、當P[j] !=?P[i],如果j此時為0,表示由P[0]~P[i]組成的字符串沒有相同的前綴和后綴,所以a[i]=0,i++繼續進行第一步;

  3、當P[j] !=?P[i],并且j不為0,表示可能包含相同前綴和后綴,則令j = a[j - 1],繼續執行第一步;

  直到計算出所有a[i]的值。

?

AC代碼見:

 1 class Solution {
 2 public:
 3     int strStr(char *haystack, char *needle) {
 4         int num = strlen(needle);
 5         int *next = new int[num];
 6         getNext(needle, next);
 7         
 8         int i = 0;
 9         int j = 0;        
10         while (haystack[i] != '\0' && needle[j] != '\0') {
11             if (haystack[i] == needle[j]) {
12                 ++i;
13                 ++j;
14             } else if (j == 0) {
15                 ++i;
16             } else {
17                 j = next[j - 1];
18             }
19         }
20         
21         free(next);
22         if (needle[j] != '\0')
23             return -1;
24         else
25             return i - j;
26     }
27     
28     void getNext(char *needle, int *next) {
29         int i = 1;
30         int j = 0;
31         next[0] = 0;
32         while (needle[i] != '\0') {
33             if (needle[i] == needle[j]) {
34                 next[i] = j + 1;
35                 ++i;
36                 ++j;
37             } else if (j == 0) {
38                 next[i] = 0;
39                 ++i;
40             } else {
41                 j = next[j - 1];
42             }
43         }
44     }
45 };
View Code

?

代碼優化:

實際編寫中,為了避免判定j是否為0,簡化操作。可以設定next數組,取代a數組。next的含義是,當kmp算法需要尋找子串下一個比較的位置時,直接從next數組中取值;

其中next[0] = -1作為哨兵位,next[i] = a[i - 1],即將a數組整體后移一位保存在next數組中。

AC代碼如下:

 1 class Solution {
 2 public:
 3     int strStr(char *haystack, char *needle) {
 4         int num = strlen(needle);
 5         int *next = new int[num];
 6         getNext(needle, next);
 7         
 8         int i = 0;
 9         int j = 0;        
10         while (haystack[i] != '\0' && j < num) {
11             if (j == -1 || haystack[i] == needle[j]) {
12                 ++i;
13                 ++j;
14             } else {
15                 j = next[j];
16             }
17         }
18         
19         free(next);
20         if (needle[j] != '\0')
21             return -1;
22         else
23             return i - j;
24     }
25     
26     void getNext(char *needle, int *next) {
27         int i = 0;
28         int j = -1;
29         int strl = strlen(needle);
30         next[0] = -1;
31         while (i < strl - 1) {
32             if (j == -1 || needle[i] == needle[j]) {
33                 next[++i] = ++j;
34             } else {
35                 j = next[j];
36             }
37         }
38     }
39 };

?

轉載于:https://www.cnblogs.com/huxiao-tee/p/4227362.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376325.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376325.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376325.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Animations動畫使用詳解

一、動畫類型 Android的animation由四種類型組成&#xff1a;alpha、scale、translate、rotate XML配置文件中 alpha漸變透明度動畫效果scale漸變尺寸伸縮動畫效果translate畫面轉換位置移動動畫效果rotate畫面轉移旋轉動畫效果Java Code代碼中 AlphaAnimation漸變透明度動畫效…

Jenkins入門指南

新手學習使用Jenkins 安裝好Jenkins后如何運行腳本 1.新建item 2.輸入任務名稱&#xff0c;選擇項目類型&#xff0c;點擊確定 3.填個描述就好了&#xff0c;新手學jenkins&#xff0c;其他都不看&#xff0c;跑起來再說 4.點這個高級&#xff0c;選擇你要運行的腳本所在…

Sublime Text 3 史上最性感的編輯器

↑ ↑ ↑ ↑ ↑ 請看文件夾 ↑ ↑ ↑ ↑ ↑ 下載 / 安裝 windows / MAC OS 官網下載&#xff0c;雙擊安裝&#xff0c;這個都會吧&#xff5e; linux linux下安裝&#xff0c;一種辦法是從官網下載 tar.bz &#xff0c;手動安裝。 這里介紹用 apt-get 自己主動安裝方法&#xf…

[轉]怎么查看和修改 MySQL 的最大連接數?

使用 MySQL 數據庫的站點&#xff0c;當訪問連接數過多時&#xff0c;就會出現 "Too many connections" 的錯誤。出現這種錯誤有兩種情況&#xff0c;一種是網站訪問量實在太大&#xff0c;服務器已經負擔不起&#xff0c;此時就應該考慮負載均衡或者其它減少服務器壓…

對qps、tps、pv、uv的理解

QPS &#xff08;Queries Per Second&#xff09;&#xff1a;每秒查詢數&#xff08;個別地方叫每秒查詢率&#xff1f;每秒查詢率是個奇怪的東西&#xff0c;每小時時速&#xff1f;&#xff09;&#xff0c;表示系統在一秒內處理的查詢次數。 TPS&#xff08;Transactions …

swift入門之TableView

IOS8更新了&#xff0c;oc還將繼續但新增了swift語言&#xff0c;能夠代替oc編寫ios應用&#xff0c;本文將使用swift作為編寫語言&#xff0c;為大家提供step by step的教程。 工具 ios每次更新都須要更新xcode&#xff0c;這次也不例外&#xff0c;但使用xcode6&#xff0c;須…

Training-ActionBar

閱讀&#xff1a;http://developer.android.com/training/basics/actionbar/index.html 對于API11以下的兼容&#xff1a; Update your activity so that it extends ActionBarActivity. For example: public class Main Activit yextends ActionBarActivity{...} In your mani…

Jmeter BeanShell學習(一) - BeanShell取樣器(一)

通過利用BeanShell取樣器設置請求發送的參數。 第一步&#xff1a;添加BeanShell取樣器 第二步&#xff1a;在BeanShell中輸入執行的代碼 log.info("腳本開始執行"); //意思是將字符串輸出到日志消息中 vars.put("username","123163.com");//…

【轉】關于Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型...

原文網址&#xff1a;http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用來說明腳本語言是python的 是要用/usr/bin下面的程序&#xff08;工具&#xff09;python&#xff0c;這個解釋器&#xff0c;來解釋python腳本&#…

分布式系統介紹-PNUTS

PNUTS是Yahoo!的分布式數據庫系統&#xff0c;支持地域上分布的大規模并發操作。它根據主鍵的范圍區間或者其哈希值的范圍區間將表拆分為表單元&#xff08;Tablet&#xff09;&#xff0c;多個表單元存儲在一個服務器上。一個表單元控制器根據服務器的負載情況&#xff0c;進行…

Jmeter BeanShell學習(一) - BeanShell取樣器(二)

利用BeanShell取樣器獲取接口返回的JSON格式的結果&#xff0c;并將該結果寫入到文件。 第一步&#xff1a;添加BeanShell取樣器 前面幾個取樣器的內容查看&#xff1a; https://blog.csdn.net/goodnameused/article/details/96985514 第二步&#xff1a;查看返回的結果格式 …

在數據庫中outlet、code、outline為聯合組件。hibarnate插入可如此插入

hibarnate對象的映射文件如下 <id name"outlet" type"string"> <column name"OUTLET" length"10" /> <generator class"assigned" /> </id> <!-- <property name"code" type"…

日怎么沒人告訴我這博客可以改博文界面的顯示寬度的

于是我妥妥的回歸了。 weebly雖然定制功能強大&#xff0c;還能穿越時空發博文&#xff0c;但是太麻煩了&#xff0c;而且用著也不像一個博客。 既然解決了這個問題&#xff0c;那Lofter除了行間距也沒什么缺點了&#xff0c;接著用吧&#xff0c;反正weebly也傳不了大圖&#…

160 - 50 DueList.5

環境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查殼 可以看出程序有加殼&#xff0c;那么我們下一步就是脫殼了。 0x01 脫殼 看上去沒什么特別的地方&#xff0c;就直接 單步跟蹤法 來脫殼吧 近call F7&#xff0c;遠call F8 來到這里 哈&…

firefox瀏覽器中silverlight無法輸入問題

firefox瀏覽器中silverlight無法輸入問題今天用firefox瀏覽silverlight網頁&#xff0c;想在文本框中輸入內容&#xff0c;卻沒想到silverlight插件意外崩潰了。google一下&#xff0c;發現這是firefox的設置問題&#xff0c;解決方法如下&#xff1a; 1、在Firefox瀏覽器地址欄…

關鍵路徑的概念和算法

AOE網&#xff1a;在一個表示工程的帶權有向圖中&#xff0c;用頂點表示事件&#xff0c;用有向邊表示活動&#xff0c;邊上的權值表示活動的持續時間&#xff0c;稱這樣的有向圖叫做邊表示活動的網&#xff0c;簡稱AOE網。AOE網中沒有入邊的頂點稱為始點&#xff08;或源點&am…

160 - 51 DueList.6

環境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查殼 發現程序沒有加殼&#xff0c;那么我們可以直接分析了。 0x01 分析 運行程序看一看 看到錯誤信息的字符串后我們可以直接搜索了。 可以看到程序會比較輸入的長度是否為8位&#xff0c;如…

寬帶上行速率和下行速率的區別

本文由廣州寬帶網http://www.ymeibai.com/整理發布&#xff0c;廣州電信寬帶報裝&#xff0c;上廣州寬帶網。 我們一般所說的4M寬帶&#xff0c;6M寬帶&#xff0c;都是指寬帶的下行速率&#xff0c;可以理解為就是下載的速度&#xff0c;平時我們用迅雷、或者網頁下載軟件時&a…

LazyInitializationException--由于session關閉引發的異常

1,頁面中進行person.department.departmentName的讀取 2,Action 中只讀取了person&#xff0c;事務作用在Service的方法中 3,后臺會有org.hibernate.LazyInitializationException出現 因為&#xff1a;Action中Service方法結束之前&#xff0c;session已經關閉了轉載于:https:/…

160 - 52 egis.1

環境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、exeinfo 3、IDA 0x00 查殼 加了UPX殼&#xff0c;那么就要脫殼了。可以使用單步法來脫殼。 UPX殼還是比較簡單的&#xff0c;開頭pushad&#xff0c;找個popad&#xff0c;然后就是jmp了。 然后就可以用OD來…