30. 串联所有单词的子串

image.png

words 的长度是相同的 可以获取总长度
str :=s[i:i+wordsLen]
获取每次截取的字符串,然后在分割成一个个word
主要比较每个字符出现的次数

  1. package main
  2. import "fmt"
  3. func findSubstring(s string, words []string) []int {
  4. if len(s)==0{
  5. return []int{}
  6. }
  7. allMap :=make(map[string]int)
  8. for _,v:=range words{
  9. allMap[v]++
  10. }
  11. wordNum :=len(words)
  12. wordLen :=len(words[0])
  13. var res []int
  14. fmt.Println(len(s)-wordLen*wordNum)
  15. for i:=0;i<=len(s)-wordLen*wordNum;i++{
  16. hasMap :=make(map[string]int)
  17. num :=0
  18. for num<wordNum{
  19. word :=s[i+num*wordLen:i+(num+1)*wordLen]
  20. if v,ok:=allMap[word];ok{
  21. hasMap[word]++
  22. if hasMap[word]>v{
  23. break
  24. }
  25. }else {
  26. break
  27. }
  28. num++
  29. }
  30. if num==wordNum{
  31. res = append(res,i)
  32. }
  33. }
  34. return res
  35. }
  36. func findSubstring1(s string, words []string) []int{
  37. if len(s)==0||len(words)==0 {
  38. return nil
  39. }
  40. allMap :=make(map[string]int)
  41. for _,v:=range words{
  42. allMap[v]++
  43. }
  44. wordsLen :=len(words)*len(words[0])
  45. var res []int
  46. for i:=0;i<=len(s)-wordsLen;i++{
  47. str :=s[i:i+wordsLen]
  48. hasMap :=make(map[string]int)
  49. star:=0
  50. for ;star<=len(str)-len(words[0]);{
  51. ss :=str[star:star+len(words[0])]
  52. if allMap[ss]>0 {
  53. hasMap[ss]++
  54. if hasMap[ss]> allMap[ss]{
  55. break
  56. }
  57. }else {
  58. break
  59. }
  60. star = star+len(words[0])
  61. }
  62. if star==len(str) {
  63. res = append(res,i)
  64. }
  65. }
  66. return res
  67. }
  68. func findSubstring2(s string, words []string) []int{
  69. if len(s)==0||len(words)==0 {
  70. return nil
  71. }
  72. allMap :=make(map[string]int)
  73. for _,v:=range words{
  74. allMap[v]++
  75. }
  76. wordsLen :=len(words)*len(words[0])
  77. var res []int
  78. for i:=0;i<=len(s)-wordsLen;i++{
  79. str :=s[i:i+wordsLen]
  80. hasMap :=make(map[string]int)
  81. start:=0
  82. for ;start<len(words);start++{
  83. ss :=str[len(words[0])*start:len(words[0])*(start+1)]
  84. //fmt.Println(ss)
  85. if allMap[ss]>0 {
  86. hasMap[ss]++
  87. if hasMap[ss]> allMap[ss]{
  88. break
  89. }
  90. }else {
  91. break
  92. }
  93. }
  94. if start==len(words) {
  95. res = append(res,i)
  96. }
  97. }
  98. return res
  99. }
  100. func main() {
  101. fmt.Println(findSubstring2("barfoothefoobarman",[]string{"bar","foo"}))
  102. }

image.png