522. 最长特殊序列 II

news2024/10/6 8:31:04

题目

给定字符串列表 strs ,返回其中最长的特殊序列的长度。如果最长特殊序列不存在,返回 -1。

特殊序列定义如下:该序列为某字符串独有的子序列(即不能是其他字符串的子序列)。

字符串 s 的子序列可以通过删去字符串 s 中的某些字符实现。

例如,“abc” 是 “aebdc” 的子序列,因为您可以删除"aebdc"中的下划线字符来得到 “abc” 。“aebdc"的子序列还包括"aebdc”、 “aeb” 和 “” (空字符串)。

示例 1:

  • 输入: strs = ["aba","cdc","eae"]
  • 输出: 3

示例 2:

  • 输入: strs = ["aaa","aaa","aa"]
  • 输出: -1

提示:

  • 2 <= strs.length <= 50
  • 1 <= strs[i].length <= 10
  • strs[i] 只包含小写英文字母

代码

完整代码

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct {
    char* s;
    int len;
} combo_t;

int cmp(const void *a, const void *b) {
    combo_t* pofa = (combo_t*)a;
    combo_t* pofb = (combo_t*)b;
    return pofb->len - pofa->len;
}

bool isSubsequence(char* a, char* b) {
    // 判断 a 是否为 b 的子序列
    int i = 0, j = 0;
    while (i < strlen(a) && j < strlen(b)) {
        if (a[i] == b[j]) {
            i++;
        }
        j++;
    }
    return i == strlen(a);
}

int findLUSlength(char** strs, int strsSize) {
    combo_t* arr = (combo_t*)calloc(strsSize, sizeof(combo_t));
    for (int i = 0; i < strsSize; i++) {
        arr[i].len = strlen(strs[i]);
        arr[i].s = strs[i];
    }
    qsort(arr, strsSize, sizeof(combo_t), cmp);

    for (int i = 0; i < strsSize; i++) {
        bool isUnique = true;

        // 检查是否是唯一的
        for (int j = 0; j < strsSize; j++) {
            if (i != j && arr[i].len == arr[j].len && strcmp(arr[i].s, arr[j].s) == 0) {
                isUnique = false;
                break;
            }
        }

        // 如果是唯一的,检查是否不是其他更长字符串的子序列
        if (isUnique) {
            bool isSub = false;
            for (int j = 0; j < i; j++) {
                if (isSubsequence(arr[i].s, arr[j].s)) {
                    isSub = true;
                    break;
                }
            }
            if (!isSub) {
                int len = arr[i].len;
                free(arr);
                return len;
            }
        }
    }

    free(arr);
    return -1;
}

思路分析

该问题可以通过以下步骤解决:

  1. 定义结构体:用来存储字符串和它们的长度。
  2. 排序:按照字符串的长度从大到小排序,这样可以先检查较长的字符串。
  3. 检查唯一性:检查当前字符串是否在列表中唯一。
  4. 判断子序列:如果当前字符串是唯一的,检查它是否不是其他更长字符串的子序列。
  5. 返回结果:如果满足条件,返回当前字符串的长度;否则返回 -1。

拆解分析

  1. 定义结构体和比较函数

    typedef struct {
        char* s;
        int len;
    } combo_t;
    
    int cmp(const void *a, const void *b) {
        combo_t* pofa = (combo_t*)a;
        combo_t* pofb = (combo_t*)b;
        return pofb->len - pofa->len;
    }
    

    结构体 combo_t 用于存储字符串及其长度。比较函数 cmp 用于按字符串长度从大到小排序。

  2. 检查是否为子序列

    bool isSubsequence(char* a, char* b) {
        int i = 0, j = 0;
        while (i < strlen(a) && j < strlen(b)) {
            if (a[i] == b[j]) {
                i++;
            }
            j++;
        }
        return i == strlen(a);
    }
    

    函数 isSubsequence 用于检查字符串 a 是否是字符串 b 的子序列。

  3. 主函数实现

    int findLUSlength(char** strs, int strsSize) {
        combo_t* arr = (combo_t*)calloc(strsSize, sizeof(combo_t));
        for (int i = 0; i < strsSize; i++) {
            arr[i].len = strlen(strs[i]);
            arr[i].s = strs[i];
        }
        qsort(arr, strsSize, sizeof(combo_t), cmp);
    
        for (int i = 0; i < strsSize; i++) {
            bool isUnique = true;
    
            for (int j = 0; j < strsSize; j++) {
            	// 这里可以优化,如果len 不同,就break,因为前面经过排序,len不同则strcmp一定 != 0
            	// 但是为了美观就不写了,因为总长度也就50条
                if (i != j && arr[i].len == arr[j].len && strcmp(arr[i].s, arr[j].s) == 0) {
                    isUnique = false;
                    break;
                }
            }
    
            if (isUnique) {
                bool isSub = false;
                for (int j = 0; j < i; j++) {
                    if (isSubsequence(arr[i].s, arr[j].s)) {
                        isSub = true;
                        break;
                    }
                }
                if (!isSub) {
                    int len = arr[i].len;
                    free(arr); // 记得提前返回的时候别内存泄漏
                    return len;
                }
            }
        }
    
        free(arr);
        return -1;
    }
    
    • 使用 combo_t 数组存储字符串和它们的长度。
    • 对数组进行排序,使得较长的字符串先被处理。
    • 遍历排序后的数组,检查每个字符串是否是唯一的。
    • 对于唯一的字符串,进一步检查它是否不是其他更长字符串的子序列。
    • 如果找到满足条件的字符串,返回它的长度;否则返回 -1。

复杂度分析

  • 时间复杂度:未优化的话是O(n^2 * m),其中 n 是字符串的数量,m 是字符串的最大长度, 可以通过仅比较相同长度字符串减小。排序的时间复杂度为 O(n log n),判断子序列的时间复杂度为 O(n * m)
  • 空间复杂度O(n * m),用于存储字符串和它们的长度。

结果

结果

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

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

相关文章

Plonky3和Binius中的Brakedown多项式承诺协议解析及优化(3)

3.2 Expander Graph and Linear-Time Encodable Linear Code 线性时间编码是线性纠错码的一种&#xff0c;核心是扩展图&#xff08;Expander Graph&#xff09;&#xff0c;如下图所示&#xff1a; Figure 3 Expander Graph Expander Graph是一种具有强连通性的稀疏图&#…

ensp防火墙web密码重置(前提通过console可以登录)

客户电脑是命令行没有用户名直接输入密码就可以登录了&#xff0c;但是web端不知道admin的密码 前两天遇到运维单位的一台防火墙web网页不知道用户名密码&#xff0c;默认的登录不了&#xff0c;但是通过console可以登录命令行&#xff0c;今天就记录下如何通过命令行修改web页…

iOS 18 照片应用程序增加了新分类用于查找二维码、收据、插图等

苹果照片应用 苹果在iOS 18的照片应用中引入了全新的设计&#xff0c;将图库和推荐部分合并为一个更集成的多合一视图。重新设计的实用工具部分经过全面改造&#xff0c;使得查找不同类型的图片更加容易。 实用工具 在iOS 17中&#xff0c;照片应用的实用工具部分只包括导入…

单调队列总结

单调队列的介绍 由于现在我也没接触过正经的单调队列的定义&#xff0c;因而引申为介绍&#xff0c; 单调队列&#xff0c;类似与单调栈&#xff0c;存储在单调队列里面的元素理应都是单调的&#xff0c;单调队列的基础使用deque&#xff08;双端队列&#xff09;去实现的&am…

DY-34/60C电压继电器 带板前底座 约瑟JOSEF

系列型号&#xff1a; DY-32电压继电器&#xff1b;DY-36电压继电器&#xff1b; DY-33电压继电器&#xff1b;DY-37电压继电器&#xff1b; DY-34电压继电器&#xff1b;DY-38电压继电器&#xff1b; DY-31电压继电器&#xff1b;DY-35电压继电器&#xff1b; DY-32/60C电…

6.17作业

//主函数 #include "widget.h" #include "from.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();From f;QObject::connect(&w,&Widget::my_jump,&f,&From::jump_slot);…

如何下载mmwave_automotive_toolbox?

摘要&#xff1a;mmwave_automotive_toolbox已经没有下载连接了&#xff0c;因为它已经和radar_toolbox集成到一起了&#xff0c;本文介绍下载方法。 链接如下 Corner Radar Overview (ti.com) 本文发布的时间时2024年6月17日&#xff0c;如果上面这个链接已经无法访问&#…

如何监控员工浏览网址(有效方法分享)

在数字化办公日益普及的今天&#xff0c;合理监控员工浏览网址成为了企业管理中的一个重要议题。 这不仅关乎工作效率的提升&#xff0c;更涉及到企业信息安全与合规管理。 以下是一些有效监控员工浏览网址的方法分享&#xff0c;旨在帮助企业管理者在保障隐私的前提下&#x…

探索AI绘画工具的前沿:创新科技与艺术的无缝融合

在科技和艺术交织的时代&#xff0c;AI绘画工具以其独特的魅力引领着创作的新潮流。本文将带您深入了解AI绘画工具的前沿技术&#xff0c;并通过最新例子展示其实际应用和潜力。 AI绘画工具概述 AI绘画工具通过集成深度学习、自然语言处理等技术&#xff0c;实现了从文字描述…

在 Selenium 中更改 User-Agent | 步骤与最佳实践

在 Selenium 中更改 User Agent 是许多网页抓取任务中的关键步骤。它有助于将自动化脚本伪装成常规浏览器&#xff0c;从而避免被网站检测到。本指南将带您了解如何在 Selenium 中更改 Google Chrome 的 User Agent&#xff0c;并提供最佳实践以确保您的网页抓取任务顺利进行。…

Pikachu靶场--RCE

exec"ping" 输入IP地址查看页面反应 可以在IP地址的后面拼接我们想要执行的命令 127.0.0.1 & ipconfig 127.0.0.1 && type C:\Windows\win.ini 127.0.0.1 | systeminfo 127.0.0.1 && net user 命令连接符 &命令1和命令2正…

Windows环境部署MySQL_8.4.0 LTS的部署安装、验证连接以及卸载全过程实操手册

前言&#xff1a; 什么是 MySQL MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统&#xff0c;关系型数据库将数据保存在不同的表中&#xff0c;而不是将所有数据放在一个大仓库内&am…

DS1339C串行实时时钟-国产兼容RS4C1339

RS4C1339串行实时时钟是一种低功耗的时钟/日期设备&#xff0c;具有两个可编程的一天时间报警器和一个可编程方波输出。地址和数据通过2线双向总线串行传输。时钟/日期提供秒、分钟、小时、天、日期、月份和年份信息。对于少于31天的月份&#xff0c;月末的日期会自动调整&…

药品光照稳定性试验箱如何进行光强度的校准和验证?

药品光照稳定性试验箱是一种用于模拟不同光照条件下药品贮存和稳定性评价的设备&#xff0c;其精准的光强度控制和稳定性对药物质量的保证至关重要。为了确保光照稳定性试验箱的光强度控制精准可靠&#xff0c;以下将介绍光照稳定性试验箱如何进行光强度的校准和验证。 1、设备…

2024年最佳插电式混合动力电动汽车

对电动汽车充满好奇和环保意识的司机们还没有准备好跨入纯电动汽车&#xff0c;他们可以找到一个折衷方案&#xff0c;即插电式混合动力车。 在过去的16年里&#xff0c;我一直在把握汽车行业的脉搏。试驾数百辆汽车、电动汽车、插电式混合动力车&#xff0c;跟踪汽车行业的新闻…

从11个视角看全球Rust程序员1/4:深度解读JetBrains最新报告

讲动人的故事,写懂人的代码 五个月前,编程界的大佬JetBrains发布了他们的全球开发者年度报告。 小吾从这份报告中找出了下面11个关于全球程序员如何使用Rust的有趣的趋势,让你学习和使用Rust更轻松。 1 这两年有多少程序员在工作中使用了Rust? 2 全球程序员使用Rust有多…

示例:WPF中DataGrid设置多级分组样式

一、目的&#xff1a;应用CollectionViewSource和GroupStyle设置DataGrid多级分组样式 二、实现 一级分组效果如下 二级分组效果如下 三、环境 VS2022 四、示例 具体实现代码如下 <TabItem Header"DataGrid - 多级分组"><TabItem.Resources><Colle…

09-Spark架构

相比MapReduce僵化的Map与Reduce分阶段计算&#xff0c;Spark计算框架更有弹性和灵活性&#xff0c;运行性能更佳。 1 Spark的计算阶段 MapReduce一个应用一次只运行一个map和一个reduceSpark可根据应用复杂度&#xff0c;分割成更多的计算阶段&#xff08;stage&#xff09;…

电影《加菲猫家族》观后感

上周看了电影《加菲猫家族》&#xff0c;本片其中有很多明亮的画面&#xff0c;相关艳丽的色彩&#xff0c;充满温馨的场景&#xff0c;很符合加菲猫的一贯画风&#xff0c;即使反派出场时&#xff0c;带有阴暗的感觉&#xff0c;看起也不是特别吓人&#xff0c;比较欢乐气氛&a…

umijs脚手架

node 16.9.1 注意node版本的问题 node 18.20.0 这个问题其实是node与中端连接出错&#xff0c;无法初始化TTY&#xff08;终端设备&#xff09;&#xff0c;可以用cmd命令行来创建umi项目 nvm管理node https://github.com/coreybutler/nvm-windows/releases 这是nvm-window…