力扣热题——最长相邻不相等子序列 |

news2025/5/17 13:00:54

        

        题目要求从字符串数组 words 中选出一个最长的子序列,使得该子序列中相邻字符串对应的 groups 数组中的值不同。通过贪心算法,可以高效地解决该问题。具体步骤为:初始化一个结果列表,遍历 words 数组,检查当前字符串的 groups 值是否与结果列表中最后一个字符串的 groups 值不同,若不同则将其加入结果列表。该算法的时间复杂度和空间复杂度均为 O(n),其中 n 为 words 数组的长度。通过一次遍历即可得到满足条件的最长子序列。

目录

题目链接:2900. 最长相邻不相等子序列 I - 力扣(LeetCode)

题目描述

解法一:贪心算法

Java写法:

C++写法:

运行时间

时间复杂度和空间复杂度

时间复杂度

空间复杂度

总结

总结


题目链接:2900. 最长相邻不相等子序列 I - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

        给你一个下标从 0 开始的字符串数组 words ,和一个下标从 0 开始的 二进制 数组 groups ,两个数组长度都是 n 。

        你需要从 words 中选出 最长子序列。如果对于序列中的任何两个连续串,二进制数组 groups 中它们的对应元素不同,则 words 的子序列是不同的。

        正式来说,你需要从下标 [0, 1, ..., n - 1] 中选出一个 最长子序列 ,将这个子序列记作长度为 k 的 [i0, i1, ..., ik - 1] ,对于所有满足 0 <= j < k - 1 的 j 都有 groups[ij] != groups[ij + 1] 。

        请你返回一个字符串数组,它是下标子序列 依次 对应 words 数组中的字符串连接形成的字符串数组。如果有多个答案,返回 任意 一个。

注意:words 中的元素是不同的 。

示例 1:

输入:words = ["e","a","b"], groups = [0,0,1]
输出:["e","b"]
解释:一个可行的子序列是 [0,2] ,因为 groups[0] != groups[2] 。
所以一个可行的答案是 [words[0],words[2]] = ["e","b"] 。
另一个可行的子序列是 [1,2] ,因为 groups[1] != groups[2] 。
得到答案为 [words[1],words[2]] = ["a","b"] 。
这也是一个可行的答案。
符合题意的最长子序列的长度为 2 。

示例 2:

输入:words = ["a","b","c","d"], groups = [1,0,1,1]
输出:["a","b","c"]
解释:一个可行的子序列为 [0,1,2] 因为 groups[0] != groups[1] 且 groups[1] != groups[2] 。
所以一个可行的答案是 [words[0],words[1],words[2]] = ["a","b","c"] 。
另一个可行的子序列为 [0,1,3] 因为 groups[0] != groups[1] 且 groups[1] != groups[3] 。
得到答案为 [words[0],words[1],words[3]] = ["a","b","d"] 。
这也是一个可行的答案。
符合题意的最长子序列的长度为 3 。

提示:

  • 1 <= n == words.length == groups.length <= 100
  • 1 <= words[i].length <= 10
  • groups[i] 是 0 或 1
  • words 中的字符串 互不相同 。
  • words[i] 只包含小写英文字母。

解法一:贪心算法

  • 初始化:我们需要一个结果列表来存储最终的答案,以及一个映射(或直接使用索引)来追踪每个单词在原数组中的位置。

  • 遍历:对于每一个单词,检查它是否可以加入到当前的结果列表中:

    • 如果结果列表为空,直接添加。
    • 否则,比较当前单词对应的 groups 值和结果列表中最后一个单词的 groups 值。如果这两个值不同,则将当前单词添加到结果列表中。

       这样确保了我们能够构造出一个满足条件的最长子序列,并且只需要一次遍历整个数组即可完成任务。

Java写法:

class Solution {
    public List<String> getLongestSubsequence(String[] words, int[] groups) {
        // 用于存储word到其索引的映射
        Map<String, Integer> wordToIndex = new HashMap<>();
        for (int i = 0; i < words.length; i++) {
            wordToIndex.put(words[i], i);
        }

        List<String> result = new ArrayList<>();

        for (String word : words) {
            if (result.isEmpty()) {
                result.add(word);
            } else {
                // 当前单词对应的group值
                int currentGroup = groups[wordToIndex.get(word)];
                // 结果列表中最后一个单词对应的group值
                int lastGroup = groups[wordToIndex.get(result.get(result.size() - 1))];

                // 如果当前单词与结果列表中最后一个单词对应不同的group,则添加到结果列表
                if (currentGroup != lastGroup) {
                    result.add(word);
                }
            }
        }

        return result;
    }
}

C++写法:

#include <vector>
#include <string>
#include <unordered_map>

using namespace std;

vector<string> getLongestSubsequence(vector<string>& words, vector<int>& groups) {
    unordered_map<string, int> wordToIndex;
    for (int i = 0; i < words.size(); ++i) {
        wordToIndex[words[i]] = i;
    }

    vector<string> result;
    for (const string& word : words) {
        if (result.empty()) {
            result.push_back(word);
        } else {
            int currentIndex = wordToIndex[word];
            int lastIndex = wordToIndex[result.back()];
            if (groups[currentIndex] != groups[lastIndex]) {
                result.push_back(word);
            }
        }
    }

    return result;
}

// 示例测试函数
#include <iostream>

void test() {
    vector<string> words = {"a","b","c","d"};
    vector<int> groups = {1,0,1,1};
    vector<string> result = getLongestSubsequence(words, groups);

    cout << "Result: ";
    for (const string& str : result) {
        cout << str << " ";
    }
    cout << endl;
}

int main() {
    test();
    return 0;
}

运行时间

时间复杂度和空间复杂度

时间复杂度

  1. 初始化映射(unordered_map):在开始时,我们需要遍历一次 words 数组来填充 wordToIndex 映射。这一步的时间复杂度是 O(n),其中 n 是 words 数组的长度。

  2. 遍历 words 数组构建结果列表:接下来,我们再次遍历整个 words 数组来构建最长子序列。对于数组中的每个单词,我们检查其对应的 groups 值与结果列表中最后一个单词的 groups 值是否不同。这里假设查找操作(包括在 unordered_map 中查找以及访问向量末尾元素的操作)平均为 O(1)。因此,这一步的时间复杂度也是 O(n)。

空间复杂度

  1. 存储 wordToIndex 映射:我们需要一个额外的空间来存储 words 数组中每个单词及其索引位置的映射。由于有 n 个单词,所以这部分的空间复杂度是 O(n)。

  2. 存储结果列表 result:在最坏的情况下,所有单词都可能被添加到结果列表中(例如当 groups 数组交替变化时)。这意味着结果列表的最大长度也可能达到 n,因此这部分的空间复杂度同样是 O(n)。

总结

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

总结

        题目要求从字符串数组 words 中选出一个最长的子序列,使得该子序列中相邻字符串对应的 groups 数组中的值不同。通过贪心算法,可以高效地解决该问题。具体步骤为:初始化一个结果列表,遍历 words 数组,检查当前字符串的 groups 值是否与结果列表中最后一个字符串的 groups 值不同,若不同则将其加入结果列表。该算法的时间复杂度和空间复杂度均为 O(n),其中 n 为 words 数组的长度。通过一次遍历即可得到满足条件的最长子序列。

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

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

相关文章

ssti刷刷刷

[NewStarCTF 公开赛赛道]BabySSTI_One 测试发现过滤关键字&#xff0c;但是特殊符号中括号、双引号、点都能用 可以考虑拼接或者编码&#xff0c;这里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…

java+selenum专题(一)

环境搭建部署篇-> 1.简介 java版的selenium&#xff0c;介绍一下java selenium自动化测试。大致和pythonselenium自动化测试差不多。基于java和selenium做自动化测试&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&…

[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五)

[逆向工程]DebugView捕获WPS日志&#xff1f;解析未运行WPS时Shell扩展加载的原因与解决方案&#xff08;二十五&#xff09; 引言&#xff1a;一个“幽灵”般的日志问题 你是否在使用 DebugView 排查系统问题时&#xff0c;发现日志中频繁出现 WPS 相关模块&#xff08;如 k…

ACM模式用Scanner和System.out超时的解决方案和原理

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;笔试强训 &#x1f4da;本系列文章为个人学…

Java注解详解:从入门到实战应用篇

1. 引言 Java注解&#xff08;Annotation&#xff09;是JDK 5.0引入的一种元数据机制&#xff0c;用于为代码提供附加信息。它广泛应用于框架开发、代码生成、编译检查等领域。本文将从基础到实战&#xff0c;全面解析Java注解的核心概念和使用场景。 2. 注解基础概念 2.1 什…

QML 属性动画、行为动画与预定义动画

目录 引言相关阅读本文使用的动画属性工程结构示例解析示例1&#xff1a;属性动画应用示例2&#xff1a;行为动画实现示例3&#xff1a;预定义动画 总结工程下载 引言 QML动画系统为界面元素提供了流畅的过渡效果。本文通过三个示例&#xff0c;结合属性动画(PropertyAnimatio…

window nvidia-smi命令 Failed to initialize NVML: Unknown Error

如果驱动目录下的可以执行&#xff0c;那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"复制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替换 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…

自学嵌入式 day19-数据结构 链表

二、线性表的链式存储 1.特点&#xff1a; &#xff08;1&#xff09;线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占用的位置上。 &#xff08;2&#xff09;所以…

东芝第3代SiC MOSFET助于降低应用中电源损耗

功率器件是管理和降低各种电子设备电能功耗以及实现碳中和社会的重要元器件。由于与比硅材料相比&#xff0c;碳化硅具有更高的电压和更低的损耗&#xff0c;因此碳化硅&#xff08;SiC&#xff09;被广泛视为下一代功率器件的材料。虽然碳化硅功率器件目前主要用于列车逆变器&…

PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践

为了适应 PD 分离式推理部署架构&#xff0c;百度智能云从物理网络层面的「4us 端到端低时延」HPN 集群建设&#xff0c;到网络流量层面的设备配置和管理&#xff0c;再到通信组件和算子层面的优化&#xff0c;显著提升了上层推理服务的整体性能。 百度智能云在大规模 PD 分离…

官方 Elasticsearch SQL NLPChina Elasticsearch SQL

官方的可以在kibana 控制台上进行查询&#xff1a; POST /_sql { “query”: “SELECT client_ip, status FROM logs-2024-05 WHERE status 500” } NLPChina Elasticsearch SQL就无法以在kibana 控制台上进行查询&#xff0c;但是可以使用postman接口进行查询&#xff1a;

5月16日复盘-目标检测开端

5月16日复盘 一、图像处理之目标检测 1. 目标检测认知 ​ Object Detection&#xff0c;是指在给定的图像或视频中检测出目标物体在图像中的位置和大小,并进行分类或识别等相关任务。 ​ 目标检测将目标的分割和识别合二为一。 ​ What、Where 2. 使用场景 目标检测用于…

mathematics-2024《Graph Convolutional Network for Image Restoration: A Survey》

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

IDEA怎么汉化idea中文改回英文版

第一步:点击左上角的File&#xff0c;然后选择Setting 第二步&#xff1a;Setting页面选择 Appearance & Behavior&#xff0c;然后展开System Settings&#xff0c;然后选择 Language and Region&#xff0c;进行修改 我操作的是2024年的版本 File->Settings -> Ap…

车道线检测----CLRKDNet

今天的最后一篇 车道线检测系列结束 CLRKDNet&#xff1a;通过知识蒸馏加速车道检测 摘要&#xff1a;道路车道是智能车辆视觉感知系统的重要组成部分&#xff0c;在安全导航中发挥着关键作用。在车道检测任务中&#xff0c;平衡精度与实时性能至关重要&#xff0c;但现有方法…

从技术视角解构 Solana Meme 币生态

在高吞吐、高并发的 Solana 网络上&#xff0c;一类轻量化、高热度的代币形式正在爆发式增长——Meme Token&#xff08;迷因代币&#xff09;。尽管起源于社群文化&#xff0c;但其技术实现并非“玩笑”&#xff0c;而是一整套构建于 Solana Runtime 与 Token Extensions 之上…

智能接处警系统:以秒级联动响应重塑应急处置效能

​​随着我国能源、化工、航空等关键行业的快速发展&#xff0c;传统消防管理模式已难以满足高效应急响应的需求。国家能源局、应急管理部、民航总局均出台专项规定&#xff0c;对消防站建设提出更高要求&#xff0c;在此背景下&#xff0c;智能接处警系统正是应对这些挑战的核…

GpuGeek 网络加速:破解 AI 开发中的 “最后一公里” 瓶颈

摘要&#xff1a; 网络延迟在AI开发中常被忽视&#xff0c;却严重影响效率。GpuGeek通过技术创新&#xff0c;提供学术资源访问和跨国数据交互的加速服务&#xff0c;助力开发者突破瓶颈。 目录 一、引言&#xff1a;当算力不再稀缺&#xff0c;网络瓶颈如何破局&#xff1f; …

C# DataGridView 选中所有复选框

问题描述 在程序中尝试选中所有复选框&#xff0c;但出现错误。如果单击顶部的完整选中/释放复选框&#xff0c;同时选中包含复选框的列&#xff0c;则选定区域不会改变。该如何解决&#xff1f; 上面的图片是点击完整版本之后的。 下面是本文的测试代码&#xff0c;函数 dat…

AB Download Manager v1.5.8 开源免费下载工具

下载文件是我们日常工作和生活中经常进行的操作。面对动辄数十GB的4K影片、设计素材包或开发工具&#xff0c;传统浏览器的单线程下载如同"涓涓细流"&#xff0c;非常影响我们的效率和体验。 那么&#xff0c;一款高效且易用的下载工具至关重要。今天就让我们解锁这…