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

news2024/10/6 20:28:40

Every day a Leetcode

题目来源:1839. 所有元音按顺序排布的最长子字符串

解法1:滑动窗口

要找的是最长美丽子字符串的长度,我们可以用滑动窗口解决。

设窗口内的子字符串为 window,每当 word[right] >= window.back() 时,说明可以按字典序升序排布,我们都可以将 word[right] 添加进 window 的末尾,我们使用一个集合 cnt 存储每次遇到的 word[right],当 cnt.size() = 5时,说明所有 5 个英文元音字母都至少出现了一次,更新长度:max_len = max(max_len, (int)window.size())。

如果遇到了不按字典序升序排布的情况,我们发现窗口必须全部清空,于是有:window = “”,cnt.clear(),同时要改变窗口的左边界 left = right,立即将 word[left] 加入进窗口和集合,重新开始遍历。

代码:

/*
 * @lc app=leetcode.cn id=1839 lang=cpp
 *
 * [1839] 所有元音按顺序排布的最长子字符串
 */

// @lc code=start

// 滑动窗口

class Solution
{
public:
    int longestBeautifulSubstring(string word)
    {
        // 特判
        if (word.size() < 5)
            return 0;
        int n = word.size();
        string window;
        unordered_set<char> cnt;
        int max_len = 0, left = 0, right = 0;
        while (right < n)
        {
            if (window.empty() || word[right] >= window.back())
            {
                window += word[right];
                cnt.insert(word[right]);
                right++;
                if (cnt.size() == 5)
                    max_len = max(max_len, (int)window.size());
            }
            else
            {
                window = "";
                cnt.clear();
                left = right;
                window += word[left];
                cnt.insert(word[left]);
                right++;
            }
        }
        return max_len;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是字符串 word 的长度。

空间复杂度:O(n),其中 n 是字符串 word 的长度。

解法2:一次遍历

由滑动窗口的启发,我们发现只设立几个变量也能达到相同的效果。

代码:

class Solution
{
public:
    int longestBeautifulSubstring(string word)
    {
        // 特判
        if (word.size() < 5)
            return 0;
        int n = word.size();
        int max_len = 0;
        int vowel = 1, cur_len = 1;
        for (int i = 1; i < n; i++)
        {
            if (word[i] >= word[i - 1])
            {
                cur_len++;
                if (word[i] > word[i - 1])
                    vowel++;
            }
            else
            {
                cur_len = 1;
                vowel = 1;
            }
            if (vowel == 5)
                max_len = max(max_len, cur_len);
        }
        return max_len;
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是字符串 word 的长度。

空间复杂度:O(1)。

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

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

相关文章

喜讯!持安科技入选2023年北京市知识产权试点单位!

近日&#xff0c;北京市知识产权局发布了“2023年度北京市知识产权试点示范单位及2020年度北京市知识产权试点示范单位复审通过名单”名单。 经过严格的初审、形式审核和专家评审&#xff0c;北京持安科技有限公司入选“2023年北京市知识产权试点单位”。 北京市知识产权试点示…

A预测蛋白质结构

基于AlphaFold2进行蛋白质结构预测的文章解析 RoseTTAFold: Tunyasuvunakool, K., Adler, J., Wu, Z. et al. Highly accurate protein structure prediction for the human proteome. Nature 596, 590–596 (2021) AlphaFold2: Accurate prediction of protein structures a…

git commit报错:running pre-commit hook: lint-staged

报错截图&#xff1a; 报错信息&#xff1a; running pre-commit hook: lint-staged 解决方式&#xff1a; 在项目(vue)的package.json文件中&#xff0c;查找 “husky” 部分&#xff0c;并确认其下的 “pre-commit” 钩子是否正确地引用了 lint-staged。 其中配置示例如下&a…

2023年中国自动排气阀产业链、市场规模及存在问题分析]图[

自动排气阀是一种用于排除管道、容器或设备中累积的空气或气体的装置。在液体流动系统中&#xff0c;气体或空气可能会积聚在管道或容器中&#xff0c;影响流体流动、导致气锁和能效降低。自动排气阀的作用是在系统中的气体达到一定压力时&#xff0c;自动地释放气体&#xff0…

LeetCode_并查集_DFS_中等_2316.统计无向图中无法互相到达点对数

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个整数 n &#xff0c;表示一张 无向图 中有 n 个节点&#xff0c;编号为 0 到 n - 1 。同时给你一个二维整数数组 edges &#xff0c;其中 edges[i] [ai, bi] 表示节点 ai 和 bi 之间有一条无向边。请…

如何解决电脑出现msvcp140.dll丢失问题,msvcp140.dll丢失的最全解决方法

首先&#xff0c;我们需要了解什么是“msvcp140.dll”。这是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。当计算机运行某些程序时&#xff0c;这个文件会被调用&#xff0c;以支持程序的正常运行。因此&#xff0c;当这个文件丢失时&…

3dmax中导出模型到unity注意事项

从3dmax中导出 1. 注意单位&#xff0c;根据需要&#xff0c;选英寸还是选厘米 2. 不能导出有错误的骨骼&#xff0c;否则导入后模型网格里出现 Skinned Mesh Renderer &#xff0c;对网格变换移动有影响&#xff0c;正常情况下都应该是 Mesh Renderer 3. 导出一般不带光源和…

【LeetCode刷题】:仅仅反转字母(双指针+字符串)

给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置 所有英文字母&#xff08;小写或大写&#xff09;位置反转 返回反转后的 s 示例 1&#xff1a; 输入&#xff1a;s “ab-cd” 输出&#xff1a;“dc-ba” 示例 2&#xff1a; …

【sqlserver】配置管理器打不开

问题描述 无法连接到 WMI 提供程序。您没有权限或者该服务器无法访问。请注意&#xff0c;您只能使用SQL Server 配置管理器来管理 SQL Server 2005 和更高版本的服务 器。无效类[0x80041010] 解决方式: 命令提示符-右键-以管理员身份运行&#xff0c;再把以下代码执行一遍&…

案例分析真题--架构师

案例分析真题--架构师 试题1 质量属性架构风格 软件架构设计 系统开发基础 数据库系统 其他嵌入式 试题1 质量属性架构风格

bug记录(feign)——如何给feign加上请求头相关的参数,让生产者获得请求头中参数

问题描述 在微服务的调用中&#xff0c;如果消费者通过feign调用生产者&#xff0c;然后生产者方法中需要用到请求头&#xff0c;从请求头中获得token&#xff0c;但是feign默认是不携带请求头的&#xff0c;因此即使消费者请求feign的时候请求头中携带了token&#xff0c;也没…

QGIS003:【03捕捉工具栏】-点、线、面图层的捕捉操作

引言&#xff1a;QGIS捕捉工具栏包括启用捕捉、捕捉图层、捕捉位置、捕捉容差、启用拓扑编辑、拓扑规则、交叉处使用捕捉、启用追踪、自动捕捉等选项&#xff0c;本文介绍各选项的基本操作。 实验数据&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1GTeBNQqQJlJPj6Yu…

堆排序;大顶堆、小顶堆

堆排序 基本介绍 堆排序基本思想 堆排序步骤图解 在第二个步骤中&#xff0c;将节点6和它的两个左右节点比较大小&#xff0c;发现右节点最大&#xff0c;所以将节点6和节点9进行交换&#xff0c;如图所示&#xff0c;数组相应位置的值也交换 总结 代码实现 """…

Ubuntu 17.10的超震撼声音权限

从GNOME GUADEC 2017开发者大会归来之后&#xff0c;Canonical的Didier Roche就开始了一个日更博客系列&#xff0c;主要讲述即将带来的Ubuntu 17.10&#xff08;Artful Aardvark&#xff09;发行版将如何从Unity到GNOME Shell的转变。有趣的是&#xff0c;Ubuntu Unity桌面环境…

c语言练习91:合并两个有序链表

合并两个有序链表 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码1&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct Li…

基于springboot实现学生综合成绩测评系统项目【项目源码】

基于springboot实现学生合成绩测评系统演示 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的springboot框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个学生综合测评系统。 SpringBoot框架 SpringBo…

操作系统【OS】多线程模型

多对一模型 一对一模型 多对多模型 定义 多个ULT映射到一个KLT 每个ULT映射到一个KLT n个ULT映射到m个KLT&#xff0c; n≥m 优点 线程管理在用户空间进行&#xff0c;效率高 一个线程被阻塞&#xff0c;运行调度另一个线程运行&#xff0c;并发能力强 克服了多对一模型…

redis - 实现周期性数据无上报检测

需求背景 以小时为周期不停地上报事件到事件平台,事件平台如果在连续2个周期 没有检测到上报的事件,就会发送告警给事件的相关责任人. 问题的难点在于如何检测连续周期内无数据? 如上图,2 点和 3 点,都没有上报数据,说明连续两个周期存在无数据上报. 解决方案 本文采用 re…

专访 Web3Go 新产品 Reiki:培育 AI 原生数字资产与创意新土壤

从 DeFi 到 NFTFi、SocialFi&#xff0c;web3 从业者在尝试 crypto 与区块链技术能为我们的生活、创作、娱乐和文化带来何种新体验&#xff0c;而生成式人工智能的突破性发展则为我们与链上世界的交互、社区内容创作等带来了新的体验&#xff0c;改变互动、交易和价值创造方式。…

C++入门——引用|内联函数|auto关键字|基于范围的for循环|指针空值

前言 C入门专栏是为了补充C的不足&#xff0c;并为后面学习类和对象打基础。在前面我们已经讲解了命名空间、输入输出、缺省参数、重载函数等&#xff0c;今天我们将完结C的入门。 下面开始我们的学习吧&#xff01; 一、引用 1、引用是什么呢&#xff1f;为什么C添加了引用&a…