Skip to content

LeetCode 830 较大分组的位置

Published: at 09:54 PMSuggest Changes

题目

在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。

例如,在字符串 s = "abbxxxxzyy"  中,就含有 "a", "bb", "xxxx", "z""yy" 这样的一些分组。

分组可以用区间 [start, end] 表示,其中 startend 分别表示该分组的起始和终止位置的下标。上例中的 "xxxx" 分组用区间表示为 [3,6]

我们称所有包含大于或等于三个连续字符的分组为 较大分组。

找到每一个 较大分组 的区间,按起始位置下标递增顺序排序后,返回结果。

题解

先写一个能用的

执行用时:96 ms, 在所有 JavaScript 提交中击败了 82.86% 的用户

/**
 * @param {string} s
 * @return {number[][]}
 */
var largeGroupPositions = function (s) {
  let arr = [];
  let temp = [];
  debugger;
  for (let index = 0; index < s.length; index++) {
    const element = s[index];
    if (temp[0] == undefined) {
      temp[0] = {
        index,
        element,
      };
    } else {
      if (temp[0].element == element) {
        temp[1] = {
          index,
          element,
        };
        if (temp[1] && temp[1].index && temp[1].index - temp[0].index >= 2) {
          if (arr[arr.length - 1] && arr[arr.length - 1][0] == temp[0].index) {
            arr[arr.length - 1] = [temp[0].index, temp[1].index];
          } else {
            arr[arr.length] = [temp[0].index, temp[1].index];
          }
        }
      } else {
        console.log(temp);

        temp[0] = {
          index,
          element,
        };
      }
    }
  }
  return arr;
};

console.log('object', largeGroupPositions('aaa'));
// largeGroupPositions("abcdddeeeeaabbbcd")

代码优化一下,官方题解

var largeGroupPositions = function (s) {
  const ret = [];
  const n = s.length;
  let num = 1;
  for (let i = 0; i < n; i++) {
    if (i === n - 1 || s[i] !== s[i + 1]) {
      if (num >= 3) {
        ret.push([i - num + 1, i]);
      }
      num = 1;
    } else {
      num++;
    }
  }
  return ret;
};

恐怖如斯的正则

var largeGroupPositions = function (s) {
  return Array.from(s.matchAll(/(.)\1\1+/g), (v) => [
    v.index,
    v.index + v[0].length - 1,
  ]);
};

var largeGroupPositions = function(s) {
    const r = []
    s.replace(/(.)\1{2,}/g, (a, _, i)=> r.push([i, i + a.length - 1]))
    return r
};

更快的扫描

var largeGroupPositions = function (s) {
  let i = 0,
    start = 0,
    r = [];
  while (++i <= s.length)
    if (s[start] !== s[i]) {
      if (i - start > 2) r.push([start, i - 1]);
      start = i;
    }
  return r;
};

栈方法,恐怖如斯,应该是目前最快的

class Stack {
  constructor() {
    this.q = [];
  }
  length() {
    return this.q.length;
  }
  top() {
    return this.q[this.length() - 1];
  }
  clear() {
    this.q.length = 0;
  }
  push(v) {
    let len = 0;
    if (v !== this.top()) {
      len = this.length();
      this.clear();
    }
    this.q.push(v);
    return len;
  }
}
var largeGroupPositions = function (s) {
  let i = -1,
    q = new Stack(),
    r = [];
  while (++i <= s.length) {
    const n = q.push(s[i]);
    if (n > 2) r.push([i - n, i - 1]);
  }
  return r;
};

干货题解

官方题解 正则 + 位 + 栈(3 解法,超 100%)


Previous Post
LeetCode 1202 字符串元素交换
Next Post
LeetCode 509 - 斐波那契数