• 【LeetCode】30. Substring with Concatenation of All Words


    You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.

    For example, given:
    s: "barfoothefoobarman"
    words: ["foo", "bar"]

    You should return the indices: [0,9].
    (order does not matter).

    题意:找出所给列表words中的单词相接的子句在s中出现的索引。

    注意:words中的单词可能重复出现

    思路:1.建立一个字典wdict,统计words中所有单词的个数

      2.判断s中所有可能的子句是否符合要求

        1)判断字据中每个单词是否出现在wdict中,没有的话,此子句不符合要求

        2)子句符合要求的话,加入新的属于子句的字典,如果子句中某个单词出现的次数超过wdict中这个单词出现的个数,此子句不符合要求

     1 class Solution(object):
     2     def findSubstring(self, s, words):
     3         """
     4         :type s: str
     5         :type words: List[str]
     6         :rtype: List[int]
     7         """
     8         res = []
     9         length = len(words[0])
    10         num = len(words)
    11         l = length*num
    12         lens = len(s)
    13         wdict = {}
    14         sset = set()#建立集合,收集所有已经符合条件的字句,减少判断次数
    15         for word in words:
    16             wdict[word] = 1+(wdict[word] if word in wdict else 0)
    17         first_char = set(w[0] for w in words)#建立集合收集所有单词中的第一个字母,减少isRequired的次数
    18         for i in range(lens-l+1):
    19             if s[i] in first_char:
    20                 tmp = s[i:i+l]
    21                 if tmp in sset or self.isRequired(tmp,wdict,length):
    22                     sset.add(tmp)
    23                     res.append(i)
    24         return res
    25     def isRequired(self,s,wdict,length):
    26         comp = {}
    27         i = 0
    28         while(i<len(s)-length+1):
    29             tmp = s[i:i+length]
    30             if tmp not in wdict:
    31                 return False
    32             else:
    33                 comp[tmp] = 1+(comp[tmp] if tmp in comp else 0)
    34                 if comp[tmp]>wdict[tmp]:
    35                     return False
    36             i += length
    37         return True
    38     
    39     

        

  • 相关阅读:
    iptables阐述防火墙
    升级openssh基于openssl
    Linux密钥认证错误解决
    keychain实现ssh对秘钥免登陆免输入密码
    rpcbind服务死活启动不了
    samba温故知新
    Linux下umask的缺省默认权限
    tomcat在线部署且查看堆栈状态
    mariadb多实例搭建
    rarlinux基于linux-x64
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6284707.html
Copyright © 2020-2023  润新知