Q30 - Hard - 串聯(lián)所有單詞的子串

給定一個(gè)字符串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯(lián)形成的子串的起始位置。

注意子串要與 words 中的單詞完全匹配,中間不能有其他字符,但不需要考慮 words 中單詞串聯(lián)的順序。

示例 1:

輸入:
s = "barfoothefoobarman",
words = ["foo","bar"]
輸出:[0,9]
解釋:
從索引 0 和 9 開始的子串分別是 "barfoor" 和 "foobar" 。
輸出的順序不重要, [9,0] 也是有效答案。
示例 2:

輸入:
s = "wordgoodgoodgoodbestword",
words = ["word","good","best","word"]
輸出:[]

暴力 2000ms

class Solution:
    def findSubstring(self, s, words):
        """
        :type s: str
        :type words: List[str]
        :rtype: List[int]
        """
        if len(words) == 0 or len(s) == 0:
            return []
        n = len(words)
        len_word = len(words[0])
        len_words = len("".join(words))
        len_s = len(s)
        res = []
        
        for i in range(len_s - len_words + 1):
            window = s[i:i+len_words]
            l = []
            for word in words:
                l.append(word)
            for j in range(n):
                word = window[j*len_word:(j+1)*len_word]
                if word in l:
                    l.remove(word)
                else:
                    break
            if l == []:
                res.append(i)
        return res

64ms

class Solution:
    def findSubstring(self, s, words):
        if len(words) == 0:
            return []
        lens = len(s)
        lenw = len(words[0])
        lenws = lenw * len(words)
        if lens < lenws:
            return []
        counter = {}
        for i in range(len(words)):
            if words[i] in counter:
                counter[words[i]] += 1
            else:
                counter[words[i]] = 1
        res = []
        for i in range(min(lenw, lens-lenws + 1)):
            s_pos = word_pos = i
            d = {}
            while s_pos + lenws <= lens:
                # 截取單詞
                word = s[word_pos:word_pos + lenw]
                # 移動(dòng)到下一個(gè)單詞
                word_pos += lenw
                if word not in counter:
                    s_pos = word_pos
                    d.clear()
                else:
                    if word not in d:
                        d[word] = 1
                    else:
                        d[word] += 1
                    while d[word] > counter[word]:
                        d[s[s_pos:s_pos + lenw]] -= 1
                        s_pos += lenw
                    if word_pos - s_pos == lenws:
                        res.append(s_pos)
        return res
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。