博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
30. Substring with Concatenation of All Words
阅读量:6721 次
发布时间:2019-06-25

本文共 2082 字,大约阅读时间需要 6 分钟。

  hot3.png

Description

tag: Hash Table, Two Pointers, String difficulty: Hard

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: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.

Note: 原题第二个例子中每个 word 的长度不一样,在此去掉

Solution

思路:建立一个map,遍历当前字符串, 当所有的 word 都出现过,记录当前位置,继续向后

func findSubstring(s string, words []string) []int {    if len(words) == 0{        return []int{}    }    wordsMap := make(map[string]int, len(words))    for _,value := range words {        wordsMap[value] = wordsMap[value] + 1    }    var result []int    wordLen := len(words[0])    bakWordsMap :=make(map[string]int, len(words))    for i:=0;i

遇到的问题:

  1. words 为空字符串问题
  2. words 中可以可以出现相同的单词

Note:

从这个题中才看出 go 的 map 操作很昂贵,看了其他人的提交,基本思路是一致的,但别人的运行时间只有12ms,而我这个是1993ms,修改了两次减少map的使用,运行时间就大幅减少,这是语言的问题,和方法无关,因此只优化了两次。

贴一下最后的优化,运行时间减少一半在900ms左右

func findSubstring(s string, words []string) []int {    if len(words) == 0{        return []int{}    }    wordsMap := make(map[string]int, len(words))    for _,value := range words {        wordsMap[value] = wordsMap[value] + 1    }    var result []int    wordLen := len(words[0])    bakWordsMap :=make(map[string]int)    matchCount := len(words)    for i:=0;i
0 { bakWordsMap[word]= bakWordsMap[word] + 1 wordsMap[word] = wordsMap[word] - 1 matchCount-- if matchCount == 0 { result = append(result, i) break } } else { break } } matchCount = len(words) for s,i := range bakWordsMap { wordsMap[s] = wordsMap[s] + i } bakWordsMap =make(map[string]int) } return result}

转载于:https://my.oschina.net/liufq/blog/2209093

你可能感兴趣的文章
触手TV下载|触手TVapp下载
查看>>
PDF文件如何修改,PDF怎么添加文本高亮
查看>>
大链表数据去重的办法
查看>>
Awk使用案例总结(运维必会)
查看>>
卸载并清理gitlab
查看>>
Nginx 负载均生产环境下的衡配置
查看>>
关于流量计算
查看>>
python笔记-循环
查看>>
未来技术与安全
查看>>
2012中国虚拟化及云计算技术年度市场研究报告
查看>>
进程管理
查看>>
Kali 开机自动启动服务
查看>>
我的友情链接
查看>>
SQL(三)、SQL语句练习
查看>>
XenServer 6.5实战系列之三:Prepare for XenServer 6.5
查看>>
红帽5.8 yum小记
查看>>
日历源代码
查看>>
我的友情链接
查看>>
Ascll、GB2312、Ansi
查看>>
ubuntu ftp 服务器搭建
查看>>