【五月集训】第六天打卡(滑动窗口)


1984. 学生分数的最小差值

题目链接

学生分数的最小差值

思路

  • 将nums排序
  • 因k表示选出k名学生,所以一直计算当前数往后k为的数与当前数的差取得最小值

题解

  • ts
function minimumDifference(nums: number[], k: number): number {
    let min = Infinity;
    nums.sort((a, b) => a - b)
    for (let i = 0; i + k <= nums.length; ++i) {
        min = Math.min(nums[k - 1 + i] - nums[i], min)
    }
    return min
};

1876. 长度为三且各字符不同的子字符串

题目链接

长度为三且各字符不同的子字符串

思路

  • 使用了map的结构来记录3个数据的子串对应的键值对
  • 判断是否每次遍历窗口满足map的长度为3的方法
  • 判断对应窗口是否满足好字符串要求

题解

  • ts
function countGoodSubstrings(s: string): number {
    let len = s.length;
    let ans = 0; //记录最后结果
    for (let i = 0; i <= len - 3; i++) {
        let temp = new Map();
        for (let j = i; j < i + 3; j++) {
            if (!temp.has(s[j])) {
                temp.set(s[j], 1);
            }
        }
        if (temp.size == 3) {
            ans += 1;
        }
    }
    return ans;
}

1839. 所有元音按顺序排布的最长子字符串

题目链接

所有元音按顺序排布的最长子字符串

思路

  • 使用快慢指针 ,遍历每一个字母
  • 判断当前字母是上一个字母的下一个
    • 如果是尝试更新慢指针和字母。
    • 如果不是重置状态。

题解

  • ts
function longestBeautifulSubstring(word: string): number {
  let left = 0;
  let right = 0;
  let ans = 0;
  // 当前的字母是哪个,初始值为 -1
  let index = -1;
  const map = {
    "a": 0,
    "e": 1,
    "i": 2,
    "o": 3,
    "u": 4
  };

  while (right < word.length) {
    const char = word[right];
    const newIndex = map[char];

    if (newIndex === index + 1) {
      // 可以追加的时候更新
      if (index === -1) {
        left = right;
      }
      index = newIndex;
    } else if (newIndex !== index) {
      // 不满足条件的时候重置状态
      index = newIndex === 0 ? 0 : -1;
      left = right;
    }
    while (word[right + 1] === word[right] && right < word.length) {
        right++;
    }
    // 如果走到 u 了,可以更新 ans
    if (index === 4) {
      ans = Math.max(ans, right - left + 1);
    }
    right++;
  }
  return ans;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值