Leetcode刷题(第438题)——找到字符串中所有字母异位词

x33g5p2x  于2022-04-24 转载在 其他  
字(1.0k)|赞(0)|评价(0)|浏览(505)

一、题目

  1. 给定两个字符串 s p,找到 s 中所有 p 异位词 的子串,返回这些子串的起
  2. 始索引。不考虑答案输出的顺序。
  3. 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

二、示例

  1. 输入: s = "cbaebabacd", p = "abc"
  2. 输出: [0,6]
  3. 解释:
  4. 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
  5. 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
  1. 输入: s = "abab", p = "ab"
  2. 输出: [0,1,2]
  3. 解释:
  4. 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
  5. 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
  6. 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

三、代码展示

  1. /**
  2. * @param {string} s
  3. * @param {string} p
  4. * @return {number[]}
  5. */
  6. var findAnagrams = function (s, p) {
  7. let res = []
  8. let sLen = s.length
  9. let pLen = p.length
  10. let map = {}
  11. let keepMap = new Map()
  12. for (let item of p) {
  13. if (map[item]) {
  14. map[item]++
  15. } else {
  16. map[item] = 1
  17. }
  18. }
  19. for (let i = 0; i <= sLen - pLen; i++) {
  20. let newStr = s.slice(i, i + pLen)
  21. if (keepMap.has(newStr)) {
  22. res.push(i)
  23. continue
  24. }
  25. let newObj = { ...map }
  26. for (let it of newStr) {
  27. if (!newObj[it]) {
  28. break
  29. } else {
  30. newObj[it]--
  31. if (newObj[it] === 0) {
  32. delete newObj[it]
  33. }
  34. }
  35. }
  36. if (Object.keys(newObj).length === 0) {
  37. res.push(i)
  38. keepMap.set(newStr, true)
  39. }
  40. }
  41. return res
  42. };

四、总结

相关文章