【大厂机试题+算法可视化】最长的指定瑕疵度的元音子串

news2025/6/10 4:08:28

题目

开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。比如:
· “a” 、 “aa”是元音字符串,其瑕疵度都为0
· “aiur”不是元音字符串(结尾不是元音字符)
· “abira”是元音字符串,其瑕疵度为2
给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。
子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。

输入描述:
首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。
接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。
输出描述:
输出为一个整数,代表满足条件的元音字符子串的长度。

用例

输入输出说明

0
asdbuiodevauufgh

3满足条件的最长元音字符子串有两个,分别为uio和auu,长度为3

2

aeueo

0没有满足条件的元音字符子串,输出0
1
aabeebuu
5满足条件的最长元音字符子串有两个,分别为aabee和eebuu,长度为5

思考一(暴力解法)

找子串问题,暴力解法比较简单,两重循环,第一重循环枚举元音字符作为子串的第一个字符,第二重循环枚举字符作为子串的最后一个字符,并统计这个子串包含的瑕疵度是否满足要求,满足要求计算子串长度,更新最大子串长度。

算法过程

  1. 首先读取输入的瑕疵度和字符串;

  2. 使用两层循环遍历所有可能的子串;

  3. 外层循环找到每个元音字符作为子串的开始;

  4. 内层循环从开始位置向后扩展,统计瑕疵度并检查结尾字符是否为元音;

  5. 当瑕疵度等于目标值且结尾为元音时,更新最大长度;

  6. 最后输出满足条件的最长子串长度。时间复杂度O (n²)。

参考代码

function solution() {
    const n = parseInt(readline());
    const s = readline();
    const set = new Set('aeiouAEIOU'.split(''));
    let maxLength = 0;

    for (let i = 0; i < s.length; i++) {
        if (!set.has(s[i])) continue;

        let currentFlaw = 0;
        for (let j = i; j < s.length; j++) {
            if (!set.has(s[j])) {
                currentFlaw++;
            }

            if (currentFlaw === n && set.has(s[j])) {
                maxLength = Math.max(maxLength, j - i + 1);
            }
        }
    }

    console.log(maxLength);
}


const cases = [
  `0
asdbuiodevauufgh`,
`2
aeueo`,
`1
aabeebuu`
];
let caseIndex = 0;
let lineIndex = 0;

const readline = (function () {
  let lines = [];
  return function () {
    if (lineIndex === 0) {
      lines = cases[caseIndex]
        .trim()
        .split("\n")
        .map((line) => line.trim());
    }
    return lines[lineIndex++];
  };
})();

cases.forEach((_, i) => {
  caseIndex = i;
  lineIndex = 0;

  solution();
});

思考二(滑动窗口)

包含指定瑕疵度的最长元音子串,子串不是子序列,子串是连续的,所以应该能用滑动窗口解答,用左右两个指针维持一个变动的窗口,这个窗口就是子串,目标是让窗口从左到右滑动覆盖整个字符串,每次窗口变动时都统计瑕疵度,更新全局满足条件的最大窗口,即最大元音子串。此题类似LeetCode 76.最小覆盖子串。
 

算法过程

  1. 预处理元音位置:遍历字符串,记录所有元音字符的位置,形成一个元音索引数组。

  2. 维护滑动窗口:在元音索引数组上使用滑动窗口,确保窗口内的瑕疵度恰好等于目标值。

  3. 快速计算窗口内瑕疵度:通过前缀和数组在 O (1) 时间内获取窗口内的瑕疵度。

滑动窗口策略关键点

  1. 窗口定义:窗口左右边界在元音索引数组上移动,而非原字符串。

  2. 瑕疵度计算:利用前缀和数组 O (1) 计算窗口内的瑕疵度。

  3. 窗口调整

    • 右边界扩展增加瑕疵度

    • 左边界收缩减少瑕疵度

    • 当瑕疵度恰好等于目标值时记录最大长度

复杂度分析

  • 时间复杂度:O (n + m),其中 n 是原字符串长度,m 是元音字符数量。预处理 O (n),滑动窗口遍历 O (m)。

  • 空间复杂度:O (n + m),主要用于存储前缀和数组和元音索引数组。

参考代码

function solution() {
  const n = parseInt(readline());
  const str = readline();
  const set = new Set('aeiouAEIOU'.split(''));
  const vowelIndices = [];
  const nonVowelCount = [];

  let count = 0;
  for (let i = 0; i < str.length; i++) {
    if (!set.has(str[i])) {
      count++;
    }
    nonVowelCount.push(count); // 记录每个字符位置对应的瑕疵度前缀和

    if (set.has(str[i])) {
      vowelIndices.push(i); // 添加元音索引
    }
  }

  const len = vowelIndices.length;
  if (len === 0) return 0;

  let maxLen = 0;
  let l = 0;
  for (let r = 0; r < len; r++) {
    // 计算当前窗口[left, right]内的瑕疵度
    const startIdx = vowelIndices[l];
    const endIdx = vowelIndices[r];
    let currentFlaw = nonVowelCount[endIdx] - (startIdx > 0 ? nonVowelCount[startIdx - 1] : 0);

    // 收缩窗口直到瑕疵度符合要求
    while (l <= r && currentFlaw > n) {
      l++;
      if (l > r) break;
      const newStartIdx = vowelIndices[l];
      currentFlaw = nonVowelCount[endIdx] - (newStartIdx > 0 ? nonVowelCount[newStartIdx - 1] : 0);
    }

    // 检查当前窗口是否符合条件
    if (currentFlaw === n) {
      const length = endIdx - vowelIndices[l] + 1;
      maxLen = Math.max(maxLen, length);
    }
  }

  console.log(maxLen);
}


const cases = [
  `0
asdbuiodevauufgh`,
`2
aeueo`,
`1
aabeebuu`
];
let caseIndex = 0;
let lineIndex = 0;

const readline = (function () {
  let lines = [];
  return function () {
    if (lineIndex === 0) {
      lines = cases[caseIndex]
        .trim()
        .split("\n")
        .map((line) => line.trim());
    }
    return lines[lineIndex++];
  };
})();

cases.forEach((_, i) => {
  caseIndex = i;
  lineIndex = 0;

  solution();
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文笔记:Large Language Models for Next Point-of-Interest Recommendation

SIGIR 2024 1 intro 传统的基于数值的POI推荐方法在处理上下文信息时存在两个主要限制 需要将异构的LBSN数据转换为数字&#xff0c;这可能导致上下文信息的固有含义丢失仅依赖于统计和人为设计来理解上下文信息&#xff0c;缺乏对上下文信息提供的语义概念的理解 ——>使用…

LeetCode 2894.分类求和并作差

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路一详解&#xff08;遍历 判断&#xff09;&#xff1a; 思路二详解&#xff08;数学规律/公式&#xff09;&#xff1a; 代码&#xff1a; Java思路一&#xff08;遍历 判断&a…

CCF 开源发展委员会 “开源高校行“ 暨红山开源 + OpenAtom openKylin 高校行活动在西安四所高校成功举办

点击蓝字 关注我们 CCF Opensource Development Committee CCF开源高校行 暨红山开源 openKylin 高校行 西安站 5 月 26 日至 28 日&#xff0c;CCF 开源发展委员会 "开源高校行" 暨红山开源 OpenAtom openKylin 高校行活动在西安四所高校&#xff08;西安交通大学…

RabbitMQ work模型

Work 模型是 RabbitMQ 最基础的消息处理模式&#xff0c;核心思想是 ​​多个消费者竞争消费同一个队列中的消息​​&#xff0c;适用于任务分发和负载均衡场景。同一个消息只会被一个消费者处理。 当一个消息队列绑定了多个消费者&#xff0c;每个消息消费的个数都是平摊的&a…

基于微信小程序的作业管理系统源码数据库文档

作业管理系统 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和微信小程序来完成对系统的…

CSS(2)

文章目录 Emmet语法快速生成HTML结构语法 Snipaste快速生成CSS样式语法快速格式化代码 快捷键&#xff08;VScode&#xff09;CSS 的复合选择器什么是复合选择器交集选择器后代选择器(重要)子选择器(重要&#xff09;并集选择器(重要&#xff09;**链接伪类选择器**focus伪类选…

【RabbitMQ】- Channel和Delivery Tag机制

在 RabbitMQ 的消费者代码中&#xff0c;Channel 和 tag 参数的存在是为了实现消息确认机制&#xff08;Acknowledgment&#xff09;和精细化的消息控制。 Channel 参数 作用 Channel 是 AMQP 协议的核心操作接口&#xff0c;通过它可以直接与 RabbitMQ 交互&#xff1a; 手…

NLP学习路线图(三十四): 命名实体识别(NER)

一、命名实体识别(NER)是什么? 命名实体识别(Named Entity Recognition, NER)是自然语言处理中的一项关键序列标注任务。其核心目标是从非结构化的文本中自动识别出特定类别的名词性短语,并将其归类到预定义的类别中。 核心目标:找到文本中提到的命名实体,并分类。 典…

【HTML】HTML 与 CSS 基础教程

作为 Java 工程师&#xff0c;掌握 HTML 和 CSS 也是需要的&#xff0c;它能让你高效与前端团队协作、调试页面元素&#xff0c;甚至独立完成简单页面开发。本文将用最简洁的方式带你掌握核心概念。 一、HTML&#xff0c;网页骨架搭建 核心概念&#xff1a;HTML通过标签定义内…

Windows开机自动启动中间件

WinSW&#xff08;Windows Service Wrapper 是一个开源的 Windows 服务包装器&#xff0c;它可以帮助你将应用程序打包成系统服务&#xff0c;并实现开机自启动的功能。 一、下载 WinSW 下载 WinSW-x64.exe v2.12.0 (⬇️ 更多版本下载) 和 sample-minimal.xml 二、配置 WinS…

【图片转AR场景】Tripo + Blender + Kivicube 实现图片转 AR 建模

总览 1.将 2D 图片转为立体建模 2. 3. 一、将 2D 图片转为立体建模 1.工具介绍 Tripo 网站 2.找图片 找的图片必须是看起来能够让 AI 有能力识别和推理的&#xff0c;因为现在的AI虽然可以补全但是能力还没有像人的想象力那么丰富。 比如上面这张图片&#xff0c;看起来虽…

LSTM-XGBoost多变量时序预测(Matlab完整源码和数据)

LSTM-XGBoost多变量时序预测&#xff08;Matlab完整源码和数据&#xff09; 目录 LSTM-XGBoost多变量时序预测&#xff08;Matlab完整源码和数据&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 普通的多变量时序已经用腻了&#xff0c;审稿人也看烦了&#…

C#学习12——预处理

一、预处理指令&#xff1a; 解释&#xff1a;是在编译前由预处理器执行的命令&#xff0c;用于控制编译过程。这些命令以 # 开头&#xff0c;每行只能有一个预处理指令&#xff0c;且不能包含在方法或类中。 个人理解&#xff1a;就是游戏里面的备战阶段&#xff08;不同对局…

Razor编程中@Helper的用法大全

文章目录 第一章&#xff1a;Helper基础概念1.1 Helper的定义与作用1.2 Helper的基本语法结构1.3 Helper与HtmlHelper的区别 第二章&#xff1a;基础Helper用法2.1 无参数Helper2.2 带简单参数的Helper2.3 带默认值的参数2.4 使用模型作为参数 第三章&#xff1a;高级Helper用法…

鸿蒙APP测试实战:从HDC命令到专项测试

普通APP的测试与鸿蒙APP的测试有一些共同的特征&#xff0c;但是也有一些区别&#xff0c;其中共同特征是&#xff0c;它们都可以通过cmd的命令提示符工具来进行app的性能测试。 其中区别主要是&#xff0c;对于稳定性测试的命令的区别&#xff0c;性能指标获取方式的命令的区…

HarmonyOS-ArkUI 自定义弹窗

自定义弹窗 自定义弹窗是界面开发中最为常用的一种弹窗写法。在自定义弹窗中&#xff0c; 布局样式完全由您决定&#xff0c;非常灵活。通常会被封装成工具类&#xff0c;以使得APP中所有弹窗具备相同的设计风格。 自定义弹窗具备的能力有 打开弹窗自定义布局&#xff0c;以…

[electron]预脚本不显示内联script

script-src self 是 Content Security Policy (CSP) 中的一个指令&#xff0c;它的作用是限制加载和执行 JavaScript 脚本的来源。 具体来说&#xff1a; self 表示 当前源。也就是说&#xff0c;只有来自当前网站或者当前页面所在域名的 JavaScript 脚本才被允许执行。"…

开疆智能Ethernet/IP转Modbus网关连接斯巴拓压力传感器配置案例

本案例是将ModbusRTU协议的压力传感器数据上传到欧姆龙PLC&#xff0c;由于PLC采用的是Ethernet/IP通讯协议&#xff0c;两者无法直接进行数据采集。故使用开疆智能研发的Ethernet转Modbus网关进行数据转换。 配置过程 首先我们开始配置Ethernet/IP主站&#xff08;如罗克韦尔…

【Redis】Redis 的持久化策略

目录 一、RDB 定期备份 1.2 触发方式 1.2.1 手动触发 1.2.2.1 自动触发 RDB 持久化机制的场景 1.2.2.2 检查是否触发 1.2.2.3 线上运维配置 1.3 检索工具 1.4 RDB 备份实现原理 1.5 禁用 RDB 快照 1.6 RDB 优缺点分析 二、AOF 实时备份 2.1 配置文件解析 2.2 开启…

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起&#xff1a; 1、根据RK809的DATASHEET&#xff0c;短按开机【100ms/500ms】/长按关机&#xff0c;长按关机。6s/8s/10s 我在网上找到的DATASHE…