当前位置: 首页 > news >正文

[M滑动窗口] lc3305、lc3306. 元音辅音字符串计数 I、II(恰好型滑动窗口+双指针+思维+代码实现)

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:3306. 元音辅音字符串计数 II

2. 题目解析

思路:

  • 恰好类型的问题,有个非常常用且重要的思维转换。
  • 恰好 k 个 = 至少 k 个 - 至少 k+1 个
  • 故,只需要实现找到在满足元音字母都出现的情况喜爱,至少有 k 个辅音字母计数过程即可。
  • 考虑字符串子串 i~j 这个区间,出现了所有的元音字母,同时至少有 k 个辅音字母。那么 j+1,j+2,j+3 ,,,n 这些都是至少有 k 个辅音字母的可选答案。
  • 故,对于每一个左指针 i 来说,我们应该找到第一个满足条件的右指针 j,并将答案类加上 n-j+1 这个后续的字符串。
  • 且 i、j 是同向移动的,不会出现 j 回退的情况。这就是一个很基本的同向双指针滑动窗口的问题了。
  • 同时注意优雅的代码实现,可以学习下 蛙佬 的代码。很是简洁,风格也相近。

  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

代码:

class Solution {
public:long long countOfSubstrings(string word, int k) {typedef long long LL;LL res = 0;auto check = [&](char c) {return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';};auto get = [&](int K) {LL ans = 0;int cnt[26] = {0};int a = 0, b = 0;int n = word.size();// 同向滑动窗口for (int i = 0, j = 0; i < n; i ++ ) { // 基于每个 i,看所能到达的 j 最近是在哪里while (j < word.size() && (a < 5 || b < K)) {   // 右指针先向后拓展到最近的合法位置if (check(word[j])) {int t = cnt[word[j] - 'a'] ++ ;if (t == 0) a ++ ;} else b ++ ;j ++ ;}// 判断当前 i、j 区间是否是合法答案,则后续的 j+1,j+2,..,n 都是合法的// 这个判断还是需要的,不然当 j == n 的时候,虽然不构成答案,但还是+1,就构成了错误答案if (a == 5 && b >= K) ans += n - j + 1;// i 指针右移,处理 i 位置的字符if (check(word[i])) {int t = --cnt[word[i] - 'a'];if (t == 0) a -- ;} else b -- ;}return ans;};return get(k) - get(k + 1);}
};

http://www.mrgr.cn/news/40246.html

相关文章:

  • https://www.aitoolpath.com/ 一个工具数据库,目前储存了有2000+各种工具。每日更新
  • Leetcode.5 最长回文子串 (快手面试题)
  • ECS - 多端口任务
  • 人工智能辅助的神经康复
  • 技术人生-电脑突然卡顿怎么办
  • 初识CyberBattleSim
  • DataEase v2 开源代码 Windows 从0到1环境搭建
  • 雅思提高口语分数的六个日常习惯 一
  • Visual Studio代码编辑快捷键
  • 如何利用ChatGPT开发一个盈利的AI写作助手网站
  • C++ | Leetcode C++题解之第448题找到所有数组中消失的数字
  • PGMP-03战略一致性
  • 669. 修剪二叉搜索树
  • Linux操作系统中hystrix
  • Keil5同时兼容C51和stm32的方法
  • 【计算机毕业设计】springboot乐校园二手书交易管理系统
  • Python | Leetcode Python题解之第448题找到所有数组中消失的数字
  • CSP-J 复赛算法 贪心算法练习
  • Java | Leetcode Java题解之第448题找到所有数组中消失的数字
  • C语言 | Leetcode C语言题解之第448题找到所有数组中消失的数字