程式碼隨想錄演算法訓練營第9天 |

哆啦**發表於2024-06-11

28.strStr()
https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/
實現strStr()程式碼隨想錄
https://programmercarl.com/0028.實現strStr.html#思路
459.重複字串
https://leetcode.cn/problems/repeated-substring-pattern/submissions/538631105/
重複字串程式碼隨想錄
https://programmercarl.com/0459.重複的子字串.html#其他語言版本

實現strStr() —— 字串匹配

題目

給你兩個字串 haystack 和 needle ,請你在 haystack 字串中找出 needle 字串的第一個匹配項的下標(下標從 0 開始)。如果 needle 不是 haystack 的一部分,則返回 -1 。

題解方法——KMP

舉例:aabaaf
字首:a;aa;aab;aaba;aabaa;
字尾: f;af;aaf;baaf;abaaf;
字首表:求最長相等前字尾->遇見衝突位置向前回退

字串 最長相等前字尾
a 0
aa 1
aab 0
aaba 1
aabaa 2
aabaaf 0

得到next表後,挨個匹配。j表示在模式中的遍歷。如果字串和模式不匹配,回退到上一個匹配點,繼續匹配。

題解程式碼

class Solution:
    def getnext(self,s):
        next_ = [0]*len(s)
        j = 0
        for i in range(1,len(s)):
            while j>0 and s[i]!=s[j]:
                j = next_[j-1]
            if s[i] == s[j]:
                j = j+1
            next_[i] = j
        return next_
    def strStr(self, haystack: str, needle: str) -> int:
        if len(needle)==0:
            return 0
        next_ = self.getnext(needle)
        j = 0
        for i in range(len(haystack)):
            while j>0 and haystack[i]!=needle[j]:
                j = next_[j-1]
            if haystack[i]==needle[j]:
                j = j+1
            if j==len(needle):
                return i-len(needle)+1
        return -1

459.重複字串

題目

給定一個非空的字串 s ,檢查是否可以透過由它的一個子串重複多次構成

題解

  • 思路1:移動匹配:移動匹配法。如果內部是由重複字串組成,那必然前後重組的新字串中也包含原有的字串;即s[1:]+s[:-1]中也含有s
  • 思路2:找到最大相同前字尾,len(s)-最大相同前字尾的長度是否能整除;如果可以整除,則說明是重複模組;
## 思路1
class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        if len(s)<=1:
            return False
        ss = s[1:]+s[:-1]
        return ss.find(s)!=-1
## 思路2
class Solution:
    def getnext(self,s):
        next_ = [0]*len(s)
        j = 0
        for i in range(1,len(s)):
            while j>0 and s[j]!=s[i]:
                j = next_[j-1]
            if s[j]==s[i]:
                j = j+1
            next_[i] = j
        return next_
    def repeatedSubstringPattern(self, s: str) -> bool:
        if len(s)==0:
            return True
        next_ = self.getnext(s)
        if next_[-1]!=0 and len(s)%(len(s)-next_[-1])==0:
            return True
        else:
            return False

相關文章