ソリューションをサブストリングのすべての単語の滞在ボタンシリーズ(パイソン)

ソリューションをサブストリングのすべての単語の滞在ボタンシリーズ

説明タイトル:
文字列sと同じ言葉のいくつかのワード長を考えます。サブストリングの開始位置が正確に言葉シリーズのフォーム内のすべての単語に形成することができる検索。

まさに言葉に言葉に部分文字列と一致していることを注意、そこに介在他の文字はありませんが、言葉一連の単語の順序を考慮する必要はありません。

実施例1:
入力:
S = "barfoothefoobarman"、
言葉= [ "FOO"、 "バー"]
出力:[0,9]
説明:
サブインデックス0及び9から文字列がそれぞれ"barfoo"および"foobarに"を開始。
出力の順序は重要ではありません、[9,0]は有効な答えがあります。
例2:
入力:
S = "wordgoodgoodgoodbestword"、
言葉= [ "言葉"、 "グッド"、 "ベスト"、 "言葉"]
出力:[]

出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

参考プログラム1:

class Solution:
    def findSubstring(self, s: str, words: List[str]) -> List[int]:
        if not words: return []
        if not s: return []
        length_words = len(words[0])
        result = []
        for index in range(len(s)-length_words*len(words)+1):
            i = index
            words_temp = []
            while(i<index+length_words*len(words)):
                if s[i:i+length_words] in words:
                    words_temp.append(s[i:i+length_words])
                    i += length_words
                else:
                    break
            if len(words)==len(words_temp) and sorted(words)==sorted(words_temp):
                result.append(index)        
        return result

結果は、1を実行します。
ここに画像を挿入説明
参考プログラム2:

class Solution:
    def findSubstring(self, s: str, words: List[str]) -> List[int]:
        if not words:
            return []
        
        words_dict = collections.defaultdict(int)
        for word in words:
            words_dict[word] += 1
            
        s_length, words_length, word_length, result = len(s), len(words), len(words[0]), list()
        for k in range(word_length):
            head_words, num = collections.defaultdict(int), 0
            for i in range(k, s_length, word_length):
                word = s[i:i + word_length]
                if word in words_dict:
                    num += 1
                    head_words[word] += 1
                    while head_words[word] > words_dict[word]:
                        pos = i - word_length*(num - 1)
                        temp_word = s[pos:pos + word_length]
                        head_words[temp_word] -= 1
                        num -= 1
                else:
                    head_words.clear()
                    num = 0
                    
                if num == words_length:
                    result.append(i - word_length*(num - 1))
        return result

結果は2を実行します。
ここに画像を挿入説明
参考プログラム3:

class Solution:
    def findSubstring(self, s: str, words: List[str]) -> List[int]:
        words_s = sorted(words)
        result = []
        if len(words_s)==0:
            return result
        len_eachword = len(words_s[0])
        len_word = len(words_s)
        total_len = len_eachword*len_word
        if len(s)<total_len:
            return result
        for word in set(words_s):
            for i in range(len(s)-total_len+1):
                checklist_s = list()
                if s[i:i+len_eachword] == word:
                    for j in range(i,i+total_len,len_eachword):
                        checklist_s.append(s[j:j+len_eachword])
                    checklist_s = sorted(checklist_s)
                    if checklist_s == words_s:
                        result.append(i)
        return result

実行結果:
ここに画像を挿入説明

公開された16元の記事 ウォンの賞賛0 ビュー171

おすすめ

転載: blog.csdn.net/chutu2018/article/details/104800161