力扣320. 列举单词的全部缩写

news2024/12/23 9:16:15

单词的 广义缩写词 可以通过下述步骤构造:先取任意数量的 不重叠、不相邻 的子字符串,再用它们各自的长度进行替换。

例如,“abcde” 可以缩写为:
“a3e”(“bcd” 变为 “3” )
“1bcd1”(“a” 和 “e” 都变为 “1”)
“5” (“abcde” 变为 “5”)
“abcde” (没有子字符串被代替)
然而,这些缩写是 无效的 :
“23”(“ab” 变为 “2” ,“cde” 变为 “3” )是无效的,因为被选择的字符串是相邻的
“22de” (“ab” 变为 “2” , “bc” 变为 “2”) 是无效的,因为被选择的字符串是重叠的
给你一个字符串 word ,返回 一个由 word 的所有可能 广义缩写词 组成的列表 。按 任意顺序 返回答案。

1、自己的解法

官解是用了位运算,但是我对位运算的题目写得不多,也就不太敏感,就没想到,所以用的就是一种很朴素的思路–回溯。

在这里插入图片描述

思路

1、 首先我一开始看到题目想到这个题目和普通的回溯能做出来的字符串切割有很大的关联,可以说是字符串分割的加强版。
2、 如果不看数字的话,可以发现,第一步就是需要把字符串分割的所有情况都能列举出来,如:w o r dw o rdw ordwordwo rdwor dw or d

所以,我一开始是完成了第一步的代码,并且每一种分割都是用一个vector来保存,里面每个元素是字符串,这一步只是为了先实现一下枚举所有分割情况,最终的代码是在此基础上进行修改的。

class Solution {
public:
    vector<vector<string>> res;

    vector<string> arr;

    void dfs(string word,int start){
        if(start == word.size()){
        // 如果已经取到最后一位了,表示 字符串分割完成,放入结果数组即可
            res.push_back(arr);
            return;
        }
// 非常朴素且经典的回溯算法模版,i表示从某个下表开始取字符串的长度,最多只能取 原字符串的长度
        for(int i = 1;i<=word.size();i++){
            if(start+i>word.size()) continue;
            string sub_word = word.substr(start,i);
            arr.push_back(sub_word);
            dfs(word,start+i);
            arr.pop_back();
        }
    }

    vector<string> generateAbbreviations(string word) {
        dfs(word,0);
        vector<string> ans;
        // 打印结果
        for(auto arr:res){
            for(auto x:arr){
                cout<<x<<'\t';
            }
            cout<<endl;
        }
        return ans;
    }
};

力扣面板打印如下,可以看出已经实现了之前的“第一步”,枚举了所有分割情况,接下来就要思考,和这个题目的关联在哪里。
根据题意,他其实就是把下面的数组中的相邻元素,一个用字符串的长度表示,一个就用字符串本身表示,并且题目强调了,数字后一定接字符串,字符串后面一定接数字。
,

然后我就想到了,可以用一个bool值去控制,如果flag此时为0,那么我只追加这段子字符串的长度,如果flag为1,我就直接追加,这样就实现了。

完整代码如下:

class Solution {
public:
    vector<string> res;

    string arr;

    void dfs(string word,int start,bool flag){
        if(start == word.size()){
            res.push_back(arr);
            return;
        }

        int len;
		
		// 全程都需要记得使用flag来控制状态
		// flag用来控制 此次是放入子字符串还是数字
        for(int i = 1;i<=word.size();i++){
            if(start+i>word.size()) continue;
            string sub_word = word.substr(start,i);
            len = sub_word.size();
            // len_len 表示 子字符串的长度变成数字字符串后的长度,有点拗口,
            // 举例: 如果len =10,那么这个len的长度就等于2
            int len_len = to_string(len).size();
            if(flag == 0){
                // 算长度
                arr += to_string(len);
                // 当前放入的是字符串长度,那么我下一步,就是要放入字符串本身
                // 因此flag置为1
                flag = 1;
            }else {
                arr += sub_word;
                flag = 0;
            }
            dfs(word,start+i,flag);
            // 如果flag为0,说明最后一步放入的是字符串,
            if(flag == 0){
            // 使用erase表示删去字符串的删除
                arr.erase(arr.size()-len,len);
                // 我最后一步放入的是字符串,上面一行代码删掉了字符串
                // 说明现在字符串的末尾是数字,那么我下一步需要的是字符串,
                // 因此把flag置为1,这样进入下一次循环,就是去放入字符串
                flag = 1;
            }else {
                // 如果flag是1,表示最后一步放入的数字
                // 最后一步放入的数字的话,如果我要pop掉,那么我需要把最后放入的数字的长度减去
                // 而不能只是想当然地减去1个字符就可以了
                arr.erase(arr.size()-len_len,len_len);
                flag = 0;
            }
        }
    }

    vector<string> generateAbbreviations(string word) {
        dfs(word,0,0);// 起始是先放入数字
        dfs(word,0,1);// 起始是先放入子字符串
        for(auto arr:res){
            cout<< arr<<endl;
        }
        return res;
    }
};

当然,这段代码其实用了两次dfs,为了控制开头是先用数字还是先用子字符串,所以提交后发现时间很长,代码不够好。

这只是自己的思路记录,使用了官解的位运算可以更快更高效。因为官解在网站上有,复制粘贴过来也没啥意思,所以就到这里啦~

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

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

相关文章

Linux第六章之vim与gcc使用

一、Linux编辑器-vim使用 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也…

【数据分享】1999—2021年地级市各类交通工具的客货运量和拥有量数据(Shp/Excel格式)

1999-2021年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、地方一般公共预算收支状况、工业企业数、固定资产投资和对外经济贸易数据、科技创新指标数据、劳动力就业及…

软考中级信息安全工程师2023下半年报名时间及报名入口官网

软考中级信息安全工程师2023下半年考试时间&#xff1a; 2023年下半年软考中级信息安全工程师的考试时间为11月4日、5日。考试时间在全国各地一致&#xff0c;建议考生提前备考。共分两科&#xff0c;第一科基础知识考试具体时间为9:00-11:30&#xff1b;第二科应用技术考试具…

【Android Framework系列】第9章 AMS之Hook实现登录页跳转

1 前言 前面章节我们学习了【Android Framework系列】第5章 AMS启动流程和【Android Framework系列】第6章 AMS原理之Launcher启动流程&#xff0c;大概了解了AMS的原理及启动流程&#xff0c;这一章节我们通过反射和动态代理对不同Android版本下的AMS进行Hook&#xff0c;实现…

Ansible —— playbook 剧本

Ansible —— playbook 剧本 一、playbook的概述1.playbook简介2.什么是Ansible playbook剧本&#xff1f;3.Ansible playbook剧本的特点4.如何使用Ansible playbook剧本&#xff1f;5.playbooks 本身由以下各部分组成 二、playbook示例1.运行playbook2.定义、引用变量3.指定远…

低代码PAAS平台源码,采用对象式和勾选式实现企业应用程序开发

管理后台低代码PaaS平台是一款基于 Salesforce Platform 的开源替代方案&#xff0c;旨在为企业提供高效、灵活、易于使用的低代码开发平台。低代码PaaS平台的10大核心引擎功能&#xff1a;1.建模引擎 2.移动引擎 3.流程引擎 4.页面引擎 5.报表引擎 6.安全引擎 7.API引擎 8.应用…

C++多线程环境下的单例类对象创建

使用C无锁编程实现多线程下的单例模式 贺志国 2023.8.1 一、尺寸较小的类单例对象创建 如果待创建的单例类SingletonForMultithread内包含的成员变量较少&#xff0c;整个类占用的内存空间较小&#xff0c;则可以使用如下方法来创建单例对象&#xff08;如果类的尺寸较大则不…

【Linux命令200例】用rcp复制远程文件到本地

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

再添新证书!数据库云管平台 zCloud 与 OceanBase 完成产品兼容互认证

近日&#xff0c;云和恩墨 zCloud 数据库云管平台&#xff08;简称&#xff1a;zCloud&#xff09;与北京奥星贝斯科技有限公司&#xff08;简称&#xff1a;OceanBase&#xff09;完成产品兼容性互认证。本次测试结果表明&#xff1a;zCloud 具备对 OceanBase 的纳管、监控告警…

工业机器视觉系统开发流程简介

工业机器视觉系统的开发过程主要包括以下几个阶段&#xff1a; 需求分析和系统设计&#xff1a;与用户合作&#xff0c;明确系统的功能和性能需求&#xff0c;并设计系统的整体架构。 软、硬件选型&#xff1a;根据需求分析结果&#xff0c;选择适合的软、硬件设备&#xff0…

NASA和uAvionix在AAM测试场部署SkyLine C2指挥和控制服务

蒙大拿州比格福克和弗吉尼亚州汉普顿2023年07月28日——美国宇航局和uAvionix签署了一项太空法案协议&#xff0c;为城市环境中的无人机系统 (UAS)开发先进的超视距(BVLOS)指挥和控制(C2)技术。根据协议&#xff0c;NASA将与uAvionix合作&#xff0c;利用基于互联网的基础设施和…

qiankun框架vue3项目,子应用什么情况下会卸载

1.手动卸载 2.路由不匹配的时候&#xff0c;会自动卸载

STM32基础入门学习笔记:基础知识和理论 开发环境建立

文件目录&#xff1a; 一&#xff1a;基础知识和理论 1.ARM简介 2.STM32简介 3.STM32命名规范 4.STM32内部功能* 5.STM32接口定义 二&#xff1a;开发环境建立 1.开发板简介 2.ISP程序下载 3.最小系统电路 4.KEIL的安装 5.工程简介与调试流程 6.固件库的安装 7.编…

K3s vs K8s:轻量级对决 - 探索替代方案

在当今云原生应用的领域中&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;已经成为了无可争议的领导者。然而&#xff0c;随着应用规模的不断增长&#xff0c;一些开发者和运维人员开始感受到了K8s的重量级特性所带来的挑战。为了解决这一问题&#xff0c;一个名为K3s的…

【数据结构与算法】单链表反转、双链表反转(含相关题型)

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 链表反转 1. 单链表反转 实现2. 双链表反转 实…

IT技术中最被人忽略的网络安全方向~超乎你的想象~

正文 听说网络工程师已成为IT人的最底层了&#xff1f;标题的问题是知乎上很多网工在提问的问题之一&#xff0c;总是在说网工行业已经不行了、网工成为最低成、网工已经没落了…… 今天针对这些问题&#xff0c;我们先明确一个看法&#xff1a; 这些都是对网工行业的误解。 …

Vue(五)git

Vue 三十二、git1.工具引入2.本地仓库3.远程仓库4.两人协作&#xff08;1&#xff09;非冲突&#xff08;2&#xff09;冲突&#xff08;3&#xff09;可视化 5.分支6.vue项目git注意 三十三、三十四、三十五、 三十二、git 1.工具引入 项目内容合并 传统&#xff1a;U盘&…

Twitter 劲敌 Threads,“魔改”了哪些 Python 技术栈?

Meta 创始人 Mark Zuckerberg 昨天在 Threads 上宣布&#xff0c;周三正式上线的 Threads 注册量已突破三千万。 Threads 是一个基本文本的社交应用&#xff0c;由 Instagram 团队开发。虽然它在功能上还无法真正取代 Twitter&#xff0c;但目前看来事实上已是 Twitter 的替代方…

前端学习--vue2--插槽

写在前面&#xff1a; 这个用法是在使用组件和创建组件中 文章目录 介绍简单使用多个插槽省写默认/后备内容作用域插槽常用实例Element-ui的el-table 废弃用法slot attributeslot-scope attribute 介绍 我们在定义一些组件的时候&#xff0c;由于组件内文字想要自定义&#…

minio-分布式文件存储系统

minio-分布式文件存储系统 minio的简介 MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置…