首页 > 极客资料 博客日记

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

2024-09-25 11:30:04极客资料围观20

文章30. 串联所有单词的子串 Golang实现分享给大家,欢迎收藏极客之家,专注分享技术知识

题目描述:
给定一个字符串 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中寻找是否存在。


版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云