28 實現 strStr() 函數

2021-03-02 IT那個小筆記
https://leetcode-cn.com/problems/implement-strstr/

給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle 字符串出現的第一個位置 (從0開始)。如果不存在,則返回  -1。

示例 1:

輸入: haystack = "hello", needle = "ll"輸出: 2

示例 2:

輸入: haystack = "aaaaa", needle = "bba"輸出: -1

說明:當 needle 是空字符串時,我們應當返回什麼值呢?這是一個在面試中很好的問題。對於本題而言,當 needle 是空字符串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符。


本題就是要實現一個indexOf函數,首先想到的就是雙指針在兩個串中比較。

暴力解法(BF)就依次掃描如果有相同的同步繼續,出現不同就中斷了,模式串回到起點主串回到下個開頭點。也就是說主串的長度會遍歷完,剩下的看模式串掃到什麼時候中斷。在最差的情況下每次模式串遍歷到最後一個中斷主串最末端才匹配到那就是O(n*m)


邊界

細節

循環結束條件

haystack空返回0

haystack比needle短返回-1

public int strStr(String haystack, String needle) {
   char[] hay = haystack.toCharArray();
   char[] need = needle.toCharArray();
   int h = hay.length;
   int n = need.length;
   int i=0,j=0;
   while(j < h && i < n){
       if(hay[j] == need[i]){
           i++;
           j++;
      }else {
           j=j-i+1;
           i=0;
      }
   }
   if(i >= n) return j-i;
   else return -1;
}

除了兩個指針依次比較之外,判斷一個串是否含另一個串直接去依次截取目標長度的子串,判斷有無相等的子串。這裡截取我直接用的substring方法,這個也實現過很多次了,怎麼寫都一樣但我們一定要知道它的實現是怎樣的才能客觀的分析它的複雜度,這裡它就是一次遍歷。

public int strStr(String haystack, String needle) {
    int n = needle.length();
    int h = haystack.length();
    for (int i = 0; i < h - n + 1; i++) {
         if (haystack.substring(i, i + n).equals(needle)) {
             return i;
         }
    }
    return -1;
}

其實這種解法和解法一是一模一樣只不過前者把截取和比較直接寫了出來,它比解法一優的點只是少遍歷了後面短的部分一個是h * (?)另一個是(h-n+1)* (?),是因為兩層遍歷分開寫可以這樣做。外面遍歷子串的開頭,裡面再遍歷子串與模式串是否相等。而解法一放到了一個循環也做到了這個邏輯


字符串匹配算法算是一個比較經典的算法,也是在計算機領域實際應用超多的算法。上面無論是解一還是解二其實都是全遍歷比較。許多科學家都發明了更多減少比較次數的方式,比如RK算法、BM算法以及KMP算法。這些在這裡暫時不介紹。之後在其他系列會出單篇講解這類以及其他的算法。

相關焦點

  • LeetCode-28.實現 strStr()(Implement strStr())
    28. 實現 strStr()實現C語言中的strStr()函數。
  • leetcode第28題-實現strStr()
    實現 strStr() 函數。給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle 字符串出現的第一個位置 (從0開始)。如果不存在,則返回  -1。
  • [函數] strstr、strrchr、substr、stristr四個函數的區別
    每天給你分享一個PHP知識點,希望能幫助到你,花一分鐘時間,看看該函數是如何用的。
  • 算法養成記:實現 strStr()
    呆萌程式設計師算法養成記LeetCode28Implement strStr()Implement strStr().This is consistent to C's strstr() and Java's indexOf().中文意思就是:實現 strStr() 函數。
  • 【函數分享】PHP函數mb_strstr 分享
    mb_strstr () 查找字符串在另一個字符串裡的首次出現。 string mb_strstr(string$haystack,string$needle[,bool$before_needle=false[,string$encoding=mb_internal_encoding()]]) 說明: mb_strstr
  • 【刷穿 LeetCode】28. 實現 strStr()(簡單)
    題目描述實現 strStr() 函數。
  • 校招面試題:編寫 strcpy, strlen, strstr, atoi 等庫函數的題目
    實現 strlen,獲取字符串長度,代碼實現:2.實現 strcpy,字符串拷貝函數,代碼實現:3.實現 strstr,子串查找函數,代碼實現:eg: LeetCode problem: Implement strStr()4.
  • 每日一道 LeetCode (9):實現 strStr()
    ❞前文合集每日一道 LeetCode 前文合集代碼倉庫GitHub:https://github.com/meteor1993/LeetCodeGitee:https://gitee.com/inwsy/LeetCode題目:實現
  • 常用C庫函數的實現
    實現C語言庫函數我們在課上也經常會給大家寫,但是都不夠全面。所以今天就給大家總結了一下。常見C庫函數的實現代碼奉上= '\0')    {        length++; } return length;}06strstrchar *strstr(const char *haystack
  • "暴力"字符匹配算法的C語言實現
    bug菌所說的暴力匹配算法就是C標準庫函數strstr(),如果你還沒有使用過或者沒有聽到過這個函數,那就有點.。字符匹配算法的應用其實是非常廣泛的,小到信息的檢索,大到網絡安全監測,一種高效的字符匹配算法能夠大大改善性能,所以目前對字符匹配算法的理論研究也是在一直進行著。
  • C語言字符串處理函數之字符串轉換、查詢函數
    介紹完字符串整體操作函數,就該到字符串查詢函數和字符串轉換函數了,至於一些字符串轉換函數,如atoi(),atof(),strtod(),strtol(),tolower(),toupper()等,以後有時間再整理整理。
  • 【每日一題】php截取字符串幾個實用的函數
    substr(string,start,length)其中start的參數正數 - 在字符串的指定位置開始負數 - 在從字符串結尾的指定位置開始0 - 在字符串中的第一個字符處開始******************************************************************strstr
  • 看代碼學安全(9 )str_replace函數過濾不當
    漏洞解析 :這一題考察的是一個 str_replace 函數過濾不當造成的任意文件包含漏洞。在上圖代碼 第18行 處,程序僅僅只是將 ../ 字符替換成空,這並不能阻止攻擊者進行攻擊。./ ,在經過程序的 str_replace 函數處理後,都會變成 ../ ,所以上圖程序中的 str_replace 函數過濾是有問題的。
  • PHP部分字符串函數匯總
    我們大家知道無論哪種語言,字符串操作都是一個重要的基礎,往往是簡單而重要。提取子字符函數(雙字節)submit($str,int start[,int length]): 從$str中strat位置開始提取[length長度的字符串]。strstr($str1,$str2): 從$str1(第一個的位置)搜索$str2並從它開始截取到結束字符串;若沒有則返回FALSE。stristr() 功能同strstr,只是不區分大小寫。
  • (基礎篇)PHP字符串函數
    PHP字符串函數包括查找字符位置函數;提取子字符函數;替換字符串;字符長度;比較字符函數;分割成數組字符;去除空格等等
  • 代碼審計Day9 - str_replace函數過濾不當
    / ,在經過程序的 str_replace 函數處理後,都會變成 ../ ,所以上圖程序中的 str_replace 函數過濾是有問題的。接著在第8行處,用 strstr 函數判斷 關於 strstr 函數,定義如下: strstr :(PHP 4, PHP 5, PHP 7)功能
  • php字符串函數匯總
    php字符串函數有哪些?php字符串函數:addcslashes — 以 C 語言風格使用反斜線轉義字符串中的字符addslashes — 使用反斜線引用字符串bin2hex — 函數把包含數據的二進位字符串轉換為十六進位值chop — rtrim 的別名
  • php字符串函數
    fprintf — 按照要求對數據進行返回,並直接寫入文檔流get_html_translation_table — 返回可以轉換的HTML實體hebrev — 將Hebrew編碼的字符串轉換為可視的文本hebrevc — 將Hebrew編碼的字符串轉換為可視的文本html_entity_decode — htmlentities ()函數的反函數
  • php字符串處理函數大全
    fprintf — 按照要求對數據進行返回,並直接寫入文檔流get_html_translation_table — 返回可以轉換的HTML實體hebrev — 將Hebrew編碼的字符串轉換為可視的文本hebrevc — 將Hebrew編碼的字符串轉換為可視的文本html_entity_decode — htmlentities ()函數的反函數