美文网首页
Substring with Concatenation of

Substring with Concatenation of

作者: fjxCode | 来源:发表于2018-09-22 15:35 被阅读0次

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.

Example 1:

Input:
  s = "barfoothefoobarman",
  words = ["foo","bar"]
Output: [0,9]
Explanation: Substrings starting at index 0 and 9 are "barfoor" and "foobar" respectively.
The output order does not matter, returning [9,0] is fine too.
Example 2:

Input:
  s = "wordgoodstudentgoodword",
  words = ["word","student"]
Output: []

思路:

  • 题的特点是被匹配字串都是等长的。所以才能将子串的单词子串,易于用哈希O(1)查找。
  • 匹配集合用哈希表计数。遍历子串及子串的单词子串,存在则加入已匹配哈希。
  • 这些情况放弃当前子串匹配:单词子串匹配次数超出,单词子串不匹配。

细节:

  • 输入条件检查: if s == "" || len(words) == 0{return nil}
  • 哈希表put需要判断,所以多写了几行代码。

解:

package main

import "fmt"

func findSubstring(s string, words []string) []int {
    if s == "" || len(words) == 0{return nil}
    res := make([]int,0,len(s))
    sSlice := []rune(s)
    wordsMap := make(map[string]int, len(words))
    lenWord := len(words[0])
    lenSubstr := lenWord * len(words)
    for _, elem := range words {
        _, ok := wordsMap[elem]
        if ok {
            wordsMap[elem] = wordsMap[elem] + 1
        } else {
            wordsMap[elem] = 1
        }
    }
    for i := 0; i <= len(s)-lenSubstr; i++ {
        subMap := make(map[string]int,len(words))
        j :=0
        for ;j<len(words);j++ {
            subStr := string(sSlice[i+j*lenWord:i+j*lenWord+lenWord])
            if num,ok := wordsMap[subStr];ok {
                if numSub,ok := subMap[subStr];ok{
                    subMap[subStr] = numSub+1
                    if numSub+1 > num {
                        break
                    }
                }else {
                    subMap[subStr] = 1
                }
            } else {
                break
            }
        }
        if j == len(words) {
            res = append(res,i)
        }
    }
    if len(res) == 0 {return nil}
    return res
}

func main()  {
    s := "aaaaaaaa"
    words := []string{"aa","aa","aa"}
    res := findSubstring(s,words)
    fmt.Print(res)
}

相关文章

网友评论

      本文标题:Substring with Concatenation of

      本文链接:https://www.haomeiwen.com/subject/jfkxoftx.html