8.4 字符串中等 443 String Compression 467 Unique Substrings in Wraparound String

news2025/1/22 18:03:50

443 String Compression

在这里插入图片描述
在这里插入图片描述

注意:这里是按照顺序压缩,不忽略顺序就不能用字母表计数再还原了。
如果char num == 1 只需要压入char本身
num > 1 时还需要压入char的个数 按字符压入

class Solution {
public:
    vector<char> Push(vector<char>& prev , int num , char letter){
        prev.push_back(letter);
        if(num == 1){
            return prev;
        }else{
            for(char ch : to_string(num)){
                prev.push_back(ch);
            }
        }
        return prev;
    }
    int compress(vector<char>& chars) {
        //按顺序压缩字符串
        //主体:遍历chars
        int n = chars.size();
        int count = 0;
        vector<char> prev;
        int res = 0 , start = 0;
        for(int i = 0 ; i < n ; i++){
            if(i == n-1 || chars[i+1] != chars[i]){
                //触发压缩计数
                count = i - start + 1;
                prev = Push(prev , count , chars[i]);
                start = i+1;
            }
        }
        res = prev.size();
        chars.clear();//chars.size() == 0
        for(int i = 0 ; i < res ; i++){
            chars.push_back(prev[i]);
        }
        return res;
    }
};

优化:使用双指针,原地压缩,不用管多余出来的部分,因为会直接被cut掉:最后输出的字符组长度是按照return来的。

class Solution {
public:
    int compress(vector<char>& chars) {
        //双指针 write read
        int n = chars.size();
        int write = 0 , start = 0;
        for(int read = 0 ; read < n ; read++){
            if(read == n-1 || chars[read+1] != chars[read]){
                //触发压缩,使用write
                int count = read - start + 1;
                //字符输入
                chars[write] = chars[read];
                write++;
                //个数字符串的输入
                if(count > 1){
                    for(char ch : to_string(count)){
                        chars[write++] = ch;
                    }
                }
                start = read+1;
            }
        }
       return write;
    }
};

467 Unique Substrings in Wraparound String【全文背诵】

在这里插入图片描述
在这里插入图片描述
constraint : 限制,束缚,行为约束---->restrain

原思路:计算单个字符,找到len >1 的子字符 ,计算其除了长度为1以外的子字符串个数
但是如果重复出现abc这个子字符,代码会全部计算进去,但这是错的,只需要计算以a开头的最长的那个字符串的数就可以了,也就是题目中的unique的要求

class Solution {
public:
    int findSubstringInWraproundString(string s) {

        vector<int> count(26,0);//记录s中字母个数
        int res = 0;
        int len = 0;

        for(int i = 0 ; i < s.size() ; i++){
            //单个字符
            if(count[s[i] - 'a'] == 0){
                res ++;
            }
            count[s[i] - 'a']++;
            //多个字符
            if(i >0 &&( s[i] == s[i-1] +1 || (s[i-1] == 'z'&&s[i] == 'a'))){
                len++;
            }else{
                if(len > 1){
                    res = res + len*(len+1)/2 - len;//长度>1的子字符串个数
                }
                len = 1;
            }
        }
        if(len > 1){
            res = res + len*(len+1)/2 - len;//长度>1的子字符串个数
        }
        return res;
    }
};

这个思路中很巧妙的是整先将s整个遍历,使用dp是用来计数以’a’+i结尾的最长字符串的最大长度
介是动态规划?!是我有眼无珠了
优点1:通过加法还原了计算长度为n的字符串的子字符串个数 1 + 2 +3…+ n = n*(n+1)/2
优点2:只取最大的长度,就完成了唯一字符串的要求,不会像原思路中将重复字符串也计算进入res中

class Solution {
public:
    int findSubstringInWraproundString(string s) {
        // dp数组,用于记录以每个字符结尾的最长子字符串的长度
        vector<int> dp(26, 0);
        int maxLen = 0; // 当前连续子字符串的长度

        for (int i = 0; i < s.size(); i++) {
            // 检查当前字符和前一个字符是否连续
            if (i > 0 && (s[i] == s[i - 1] + 1 || (s[i - 1] == 'z' && s[i] == 'a'))) {
                maxLen++;
            } else {
                maxLen = 1;
            }

            int index = s[i] - 'a';
            dp[index] = max(dp[index], maxLen);
        }

        // 计算结果,即所有以每个字符结尾的最长子字符串长度之和
        int res = 0;
        for (int len : dp) {
            res += len;
        }

        return res;
    }
};

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

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

相关文章

吴恩达机器学习COURSE1 WEEK3

COURSE1 WEEK3 逻辑回归 逻辑回归主要用于分类任务 只有两种输出结果的分类任务叫做二元分类&#xff0c;例如预测垃圾邮件&#xff0c;只能回答是或否 实际上&#xff0c;在逻辑回归中&#xff0c;我们要做的任务就类似于在数据集中画出一个这样的曲线&#xff0c;用来作为…

数据拯救利器:必备免费数据恢复软件清单

说起办公室里的那些小插曲&#xff0c;有时候真是让人哭笑不得。这不&#xff0c;前几天我就遇到了个大麻烦——硬盘分区一不小心给搞砸了&#xff0c;眼看着那些重要的文件、报告还有客户资料就要跟我“说拜拜”&#xff0c;心里那个急啊&#xff0c;简直就像热锅上的蚂蚁&…

CSP2019第二题: 公交换乘

CSP 2019 公交换乘 题目来源&#xff1a;牛客网 题目&#xff1a;* 示例1 输入 6 0 10 3 1 5 46 0 12 50 1 3 96 0 5 110 1 6 135输出 36题意&#xff1a; 根据输入&#xff0c;计算地铁花费不能用到优惠券的公交车的花费 知识点&#xff1a; 结构体 思路&#xff1…

Spring(Day2)

一、静态代理 静态代理的主要特点是代理类和被代理类通常具有相同的接口&#xff0c;这样客户端代码可以透明地使用代理类代替被代理类。 首先我们建立一个接口Shopping&#xff0c;在里面定义一个shopping方法。然后创建两个类EasyA和Proxy类来继承Shopping类&#xff0c;并重…

前端 react 实现图片上传前压缩 缩率图

目录 一、安装 二、编写工具类 三、获取压缩后的File对象 一、安装 npm install compressorjs 或 yarn add compressorjs 官方文档&#xff1a;compressorjs - npm (npmjs.com) 二、编写工具类 /*** author Dragon Wu* since 2024/8/4 12:23* 图片压缩工具*/ import Com…

《无畏契约》现已正式登陆Xbox Series X|S和PS5主机

拳头游戏日前已在没有任何通知的情况下直接在 Xbox Series X|S 和 PS5 主机上推出了其竞技射击游戏《无畏契约》。经过6 月的短暂测试后&#xff0c;游戏的主机版已经在美国、加拿大、欧洲、日本和巴西推出&#xff0c;将包括与 PC 版相同的玩法、英雄和技能。 主机版本将永远不…

论网络流(最大流篇)--新手入门超详解--包教包会

论网络流--新手入门超详解--包教包会 1 前言2 什么是最大流3最大流问题的求解&#xff08;1&#xff09;问题转化--增广路的引入&#xff08;2&#xff09;走回头路--EK算法&#xff08;3&#xff09;EK的弊端&#xff08;4&#xff09;化图为树--DINIC算法 4后记 1 前言 网络…

小型空气净化器什么牌子好?小型空气净化器用户体验

自从家里有了4只英短后&#xff0c;一到季节我就得不停的拖地刷床&#xff0c;除了这些可以手动清理的猫毛之外&#xff0c;那么空气中的猫毛怎么办&#xff1f;多猫家庭确实很快乐&#xff0c;但一到换毛季&#xff0c;家里地上、空气里全是猫毛。每天都需要拼命的吸地板&…

Linux命令用法

文章目录 前言一、Linux基础命令1. Linux目录结构2. Linux命令入门3. 目录切换相关命令&#xff08;cd、pwd&#xff09;4. 相对路径、绝对路径和特殊路径符5. 创建目录命令&#xff08;(mkdir&#xff09;6. 文件操作命令part1(touch、cat、more&#xff09;7. 文件操作命令pa…

经验分享|temu电商项目怎么做能更好的盈利?

在当今竞争激烈的电商市场中&#xff0c;如何让TEMU这样的电商项目实现更好的盈利&#xff0c;是每个创业者和企业家关注的核心问题。以下是几点关键的策略和方法&#xff0c;可以帮助TEMU电商项目实现更好的盈利。 首先&#xff0c;产品选择和定位至关重要 TEMU需要选择具有市…

黑马Java零基础视频教程精华部分_10_面向对象进阶(2)_多态、包、final、权限修饰符、代码块

系列文章目录 文章目录 系列文章目录一、多态1、什么是多态&#xff1f;2、多态的表现形式3、多态的前提4、多态的好处5、多态调用成员的特点6、多态的优势和弊端7、引用数据类型的类型转换 二、包1、什么是包&#xff1f;2、包名的规则3、使用其他类的规则 三、final 最终的&a…

通过指令深入了解Linux

1.简单介绍XShell 未来我的所有关于Linux的讲解都是提供XShell登入远程的Linux云服务器来教学的&#xff0c;且以centos为例。 1.1下载安装XShell xshell 下载安装时选择“home/school”为免费版本。 1.2 使用XShell登录主机 在XShell终端输入 ssh rootip ip为你所购买的…

功能实现——使用 RestTemplate 进行跨项目接口调用

目录 1.需求说明2.项目环境搭建3.代码实现3.1.使用 RestTemplate 进行调用3.1.1.项目 A3.1.2.项目 B 3.2.测试3.3.使用 JsonObject 来传递和接收 json 数据3.3.1.说明3.3.2.代码实现 3.4.其它说明3.4.1.restTemplate.exchange()3.4.2.restTemplate.postForObject()3.4.3.区别总…

【Java】Java学生成绩管理系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Ubuntu 18.04,调整字体大小, 隐藏GNOME顶部状态栏

先安装 sudo apt-get install gnome-tweak-tool sudo apt install gnome-shell-extensions 安装后出现这个界面 这里可以调整字体大小 安装工具扩展&#xff1a; sudo apt-get install gnome-shell-extension-autohidetopbar 这里可以出现设置项 打开&#xff0c;并且…

【Altium Designer】Details Net has only one pin (Pin U1-12) 解决办法

报错图&#xff1a; 报错含义&#xff1a; Details Net has only one pin (Pin U1-12) 引脚label没接其他元器件。 解决办法1 修改报告提示&#xff0c;将“错误”改为“不报告”&#xff0c;如下图&#xff0c;在工程上 右键>>工程选项>>找到相应的错误标签提示…

个人主体的小程序可以变更为企业主体吗?

小程序迁移变更主体有什么作用&#xff1f;长期以来&#xff0c;由于部分小程序在注册时&#xff0c;主体不准确的历史原因&#xff0c;或者小程序的主体发生合并、分立或业务调整等现实状况&#xff0c;在小程序登记主体不能对应实际运营人的情况下&#xff0c;导致账号在认证…

基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…

【MongoDB数据库之未授权漏洞】

步骤一&#xff1a; 在Kali上执行以下命令搭建起MongoDB的漏洞环境.. 拉取mongo(3.6.6版本)镜像 docker pull mongo:3.6.6 启动镜像 docker run --name mongo-master -p 27017:27017 -d mongo:3.6.6 查看镜像 docker ps 步骤二&#xff1a;使用Nmap的插件脚本进行扫描..发现…

RIR转换Revit尺寸标注和值到Rhino指定图层中

RIR转换Revit尺寸标注和值到Rhino指定图层中 1、使用新增的Dimension Properties节点&#xff0c;获取尺寸标注的线和文字 2、通过elefont包的节点&#xff0c;将起按指定图层bake到rhino中 3、funbim v0.6.4版本节点包已更新到food4rhino&#xff0c;欢迎下载试用