串联所有单词的子串--python

该博客讨论了一个编程问题,即如何在给定字符串中找出可以由一系列相同长度的单词完全组成的子串起始位置。示例展示了不同输入和输出情况,并分析了暴力解决方法的局限性,如处理重复单词的困难。参考代码提供了一种解决方案,通过排序和检查子串是否匹配words来提高效率。
摘要由CSDN通过智能技术生成

30. 串联所有单词的子串

难度困难574

给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。

示例 1:

输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。

示例 2:

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

示例 3:

输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成
  • 1 <= words.length <= 5000
  • 1 <= words[i].length <= 30
  • words[i] 由小写英文字母组成

通过次数86,526提交次数239,367

 我的分析:

暴力解决

  • 第一层循环是提供内层循环的起始位置,超出长度则跳出
  • 第二层循环直接搜索查找words在源字符串当中的下标
  • 判断:只有当找到的字符串下标是可以串联起来的,那么就是符合要求
  • 列表设计:内层循环的字符串包含了字符串的起始位置和该字符串的长度,外层循环的列表就是保存符合要求的字符串的其实位置
  • 缺点:不好处理words当中的重复字符串

我的代码:

def findSubstring(s, words):
    start = 0
    len_s = len(s)
    ls_out = []
    while start < len_s:
        next  = len_s
        t = 0
        ls_in = []
        #开始寻找words最近匹配的下标
        for i in range(len(words)):
            index = s[start:].find(words[i])
            if index < 0 :
                start = len_s
                break;
            if index < next:
                next = index
                t = i
            ls_in.append([start + index,len(words[i])])
        #如果都找到元素,继续
        if start < len_s:
            #判断该列表是否符合题目要求,如果符合,就加入到结果的列表中
            ls_in.sort()
            flag = True
            for i in range(len(words)-1):
                #当有重复的words需要特殊处理一下
                if ls_in[i][0] + ls_in[i][1] != ls_in[i+1][0]:
                    flag = False
            if flag:
                ls_out.append(ls_in[0][0])
            start += next + ls_in[t][1]
            print(ls_in)
    #print(ls_out)
    return ls_out

运行结果:

参考代码:

class Solution:
    def findSubstring(self, s: str, words: List[str]) -> List[int]:        
        wordnum = len(words)
        wordlenth = len(words[0])
        words = sorted(words)
        ans = list()
        def issub(string):
            #print(string)
            tmp = list()
            for i in range(0,len(string),wordlenth):
                tmp.append(string[i:i+wordlenth])
            tmp = sorted(tmp)
            if tmp == words:
                return True
            else:
                return False
        
        for i in range(len(s)-wordnum*wordlenth+1):
            if issub(s[i:i+(wordnum*wordlenth)]) == True:
                ans.append(i)
        return ans

 运行结果:

 思路分析:

其实也是暴力求解的方法时间复杂度也是O(n*n)

  • 先对原来字符串进行截取对应长度
  • 再用截取字符串跟words进行匹配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值