首页 > 其他分享 >30. 串联所有单词的子串 Golang实现

30. 串联所有单词的子串 Golang实现

时间:2024-09-25 11:26:26浏览次数:1  
标签:子串 int 30 len Golang words 字符串 left

题目描述:
给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同
s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串

例如,如果 words = ["ab","cd","ef"], 那么 "abcdef", "abefcd","cdabef", "cdefab","efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。
返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

示例 1:
输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。
子串 "barfoo" 开始位置是 0。它是 words 中以 ["bar","foo"] 顺序排列的连接。
子串 "foobar" 开始位置是 9。它是 words 中以 ["foo","bar"] 顺序排列的连接。
输出顺序无关紧要。返回 [9,0] 也是可以的。

题目分析:
题目希望找到s中字符数组的字符串的所有排列组合的开始下标。注意题目提到的对所有条件的标示,字符数组的字符串的长度的长度是相同的。设置这个条件自然是有用的,如果字符串的长度不相同,那么只能找到所有可能的字符串,再在s中去匹配,但是长度相同,就可以使用固定大小的滑动窗口来解决,只要连续出现的字符串能覆盖掉所有words,就是找到成功。 如何判断单词是否出现==>通过词频进行统计。

输入: 字符串 s,字符串数组 words
输出: words中所有字符的排列组合在s中开始的下标
条件: words中所有字符串的长度相同 1 <= s.length <= 10⁴

点击查看代码
func findSubstring(s string, words []string) []int {
    if len(words) == 0 || len(s) < len(words)*len(words[0]) {
        return []int{}
    }

    wordsCount := make(map[string]int)
    for _, word := range words {
        wordsCount[word]++
    }
    wordLen := len(words[0])
    totalWords := len(words)
    res := []int{}

    for i := 0; i < wordLen; i++ {
        left := i
        count := 0
        windowCount := make(map[string]int)

        for right := i; right <= len(s)-wordLen; right += wordLen {
            word := s[right : right+wordLen]
            if _, exists := wordsCount[word]; exists {
                windowCount[word]++
                count++

                for windowCount[word] > wordsCount[word] {
                    leftWord := s[left : left+wordLen]
                    windowCount[leftWord]--
                    count--
                    left += wordLen
                }

                if count == totalWords {
                    res = append(res, left)
                }
            } else {
                windowCount = make(map[string]int)
                count = 0
                left = right + wordLen
            }
        }
    }
    return res
}

解法二:
依照题目的意思,先得到所有单词的排列组合,再将每个单词放入s中寻找是否存在。

标签:子串,int,30,len,Golang,words,字符串,left
From: https://www.cnblogs.com/CharlseGo/p/18430946

相关文章

  • golang学习笔记11-模块化与包管理【重要】
    注:本人已有C,C++,Python基础,只写本人认为的重点。在第六节(golang学习笔记6)中,我讲了如何自定义包,包其实有两种引用方式,一种是不用模块,还有种是用模块。不用模块的是旧版本的做法,因为在18年8月发布的1.11版本中,增加了模块管理的内容,到现在六年多了,所以旧版本的方法早过时了。......
  • 【LTSpice】【LTM4630】【2. 电压调节仿真】
    文章目录前言一、搭建电路二、开始仿真三.读取直流电压总结前言本篇学习使用LTSpice仿真观察LTM4630的电路,通过阅读手册,自己搭建电路,并配置参数,观察电压输出的变化。一、搭建电路打开LTSpice软件后,Ctrl+N新建一个图纸。按快捷键P,进入器件选择界面,输入LTM4630,单击......
  • FINC3012 Derivative Securities
    FINC3012DerivativeSecurities Assignment2024 S2This assignment is designed to help students study and analyze real-life derivative trading and preparefortheirfuturetrading-based jobinterviewsandcareersinthefinancialindustry.Stu......
  • 新一代工业物联网连接:DRP10188300001,DRP10188300002,DRP10188300011,DRP10188300012
    工业以太网连接器能够实现以太网和其他工业协议的物联网连接,覆盖了从企业/云到工厂车间中传感器/执行器的所有操作层面。工业RJ系列模块化以太网插头提供符合ANSI/TIA-568.2-D的CAT6A性能。它在长达100m的应用中支持千兆位以太网协议和10G链路。可现场端接的设计便于组......
  • 欧米茄绿海马300复刻表、一比一在哪里可以入到?
    大家好,一个专注腕表知识的爱好者,不定时更新腕表真假对比,拆解评测以及视频解说,学会用专业知识了解腕表的好与坏,让您在玩表之路不入坑。夏天当然要去海边玩啦,爱人陪伴身侧,一起吹着海边的夏夜晚风,简直完美了! 在普遍炎热的天气中,平均气温22摄氏度左右的大连是个好去处,跨海大桥超......
  • golang 父类调用子类方法、继承多态的实现方式
    golang父类调用子类方法、继承多态的实现方式-个人文章-SegmentFault思否 实现思路go语言中,当子类调用父类方法时,“作用域”将进入父类的作用域,看不见子类的方法存在(个人想象的)我们可以通过参数将子类传递给父类,实现在父类中调用子类方法。实现方式有两种:一、基于......
  • EtherCAT(以太网控制自动化技术)协议以其高带宽、低延迟特性,在工业自动化领域占据重要地
    一、MR30分布式IO模块概述EtherCAT(以太网控制自动化技术)协议以其高带宽、低延迟特性,在工业自动化领域占据重要地位。明达技术自主研发的MR30分布式IO模块作为EtherCAT协议的杰出应用,集成了多种输入输出功能,通过EtherCAT总线实现与主站的高效通信与控制,为纸巾包装行业带来革新。二、......
  • 月薪30k起,AI产品经理门槛揭秘:零基础转行真的可能吗?
    01什么是AI产品经理AI产品经理是对AI技术应用和功能落地负责,并为公司带来商业价值的一群人,主要集中在计算机视觉、语音、策略。cv:计算机视觉的AI产品,主要负责一些手势、肢体和其他部分检测的相关产品岗nlp:语音的AI产品,涉及nlp(自然语言处理)、asr(语音识别)、tts(语音合成)的......
  • navicat无法连接远程mysql数据库1130报错的解决方法
    出现报错:1130-Host'ipaddress'isnotallowedtoconnecttothisMySQLservenavicat,当前ip不允许连接到这个MySQL服务解决当前ip无法连接远程mysql的方法1.查看mysql端口,并在服务器安全组中放开相应入方向端口后重启服务器sudonetstat-tulnp|grepmysql查看端......
  • 日入300+,民间诡异故事玩法,简单冷门流量大
    民间诡异故事一直以来都是一个受欢迎的题材,随着中视频计划的兴起,创作者能够轻松获得收益,尤其是播放量高的视频,常常能带来可观的收入。对于新手来说,入门门槛相对较低,竞争又不激烈。教程下载:百度网盘链接https://pan.baidu.com/s/1qJAU9nYHyGn65RHtpAGCvw?pwd=6666大纲:1.项目......