LeetCode #316 Remove Duplicate Letters

leetcode的C++答案 leetcode的C++答案 答案中有编程思路,以及部分题提供多种方法。时间复杂度低,均通过leetcode网站验证。 立即下载

题目

Remove Duplicate Letters

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Example 1:

Input: "bcabc"
Output: "abc"

Example 2:

Input: "cbacdcbc"
Output: "acdb"

Difficulty: Hard

分析

题目的关键是,要给出词典顺序最小的结果字符串。

我一开始的想法是,从后往前检查,把搜到的第一个不唯一的字符 s[i] ,和它前面的一个副本 s[j] ,比较 s[j..i-1] 和 s[j+1...i] ,从而决定要选择哪个位置,去除哪个字符。

比如:

bcabc -> (remove b) -> babc  -> (remove b) -> abc
cbacdcbc -> (remove c) -> cbacdbc -> (remove c) -> cbacdb -> (remove b) -> cacdb -> (remove c) -> acdb

但是有一个反例:

defcbeabdc -> (remove c) -> defbeabdc -> (remove d) -> defbeabc 
	-> (remove b) -> defbeac -> (remove e) -> defbac

正确答案应为 defabc 。

贪心算法

在网站上我看到了这个递归的贪心算法,它的思路是这样的。

思路

每一次的贪心选择即为答案最左端的字母。如何进行贪心选择呢?由题目要求可以知道,这个贪心选择得到的字母应该尽可能地小。姑且称呼这个选择为“最小字母”,它应当是在一定范围内最小的字母。

但是,这样的贪心选择必然有中止条件或限制范围。假想某个“最小字母”左边有唯一的字母,比如CBDDF,B左边有C,C在该字符串中是唯一的。这种情况下,以B作为贪心选择是不合理的。

而如果“最小字母”左边的字母,在“最小字母”右边也有它们的重复,那么左边的这些字母完全可以舍去,它们不会比“最小字母”小,由它们无法得到字典顺序最小的答案字符串。比如CBABC,A左边的CB可以舍去。

所以,字符串 s 中的 “最小字母” s[pos] 应该满足这样的条件:

  • s[0...pos-1] 中的字母,在字符串 s 中不是唯一的

  • s[pos...] 中的字母包括了所有在字符串 s 中唯一的字母

(在字符串 s 中没有唯一字母的情况下,会有多个“最小字母”,比如abcacb。这时选择最左边的“最小字母”。)

取出 s[pos] ,加入答案字符串中。把右边的子串 s[pos+1...] 中重复的字母 s[pos] 去掉后,对新的字符串重复上述操作。

例子

答案字符串待处理字符串第一个唯一字母最小字母
defcbeabdcfd
defcbeabcfe
defcbabcff
defcbabcaa
defabcbb
defabccc
defabc

C++代码

class Solution {
public:
    string removeDuplicateLetters(string s) {
		int count[26] = {0};
		for(int i = 0; i < s.length(); i++){
			count[s[i] - 'a']++;
		}
		int pos = 0;
		for(int i = 0; i < s.length(); i++){
			if(s[i] < s[pos]) pos = i;
			if(--count[s[i] - 'a'] == 0) break;
		}
		string suffix;
		if(pos + 1 > s.length()) suffix = "";
		else suffix = s.substr(pos + 1, s.length() - pos - 1);
		return s.length() == 0 ? "" : s[pos] + removeDuplicateLetters(removeOneLetter(suffix, s[pos]));
    }

private:
	string removeOneLetter(string s, char ch){
		while(1){
			int index = s.find(ch);
			if(index != -1) s = s.erase(index, 1);
			else break;
		}
		return s;
	}
};

因为 removeDuplicateLetters 的次数不会超过 26 26 26 ,在 removeDuplicateLetters 中遍历的长度不会超过 n n n ,所以运算的总次数不会超过 26 ∗ n 26*n 26∗n ,该算法的时间复杂度为 O ( n ) O(n) O(n) ,空间复杂度也为 O ( n ) O(n) O(n) 。

leetcode316-Leetcode-Solutions:此存储库包含C++中的Leetcode解决方案 leetcode 316 Leetcode-解决方案 此存储库包含 C++ 中的 Leetcode 解决方案 注意:不主动发布解决方案。 问题索引 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () 立即下载

相关推荐

systermverilog中for循环中的fork join执行情况分析

仅为本人学习记录,如有错误感谢指正!

qq_63807221的博客 1455

Leetcode-316-去除重复字母

首先,seen 中字符不重复,其大小会受字母表大小的限制,所以是O(1)。虽然看起来是双重循环,但内循环的次数受栈中剩余字符总数的限制,因为栈中的元素不重复,不会超出字母表大小,因此最终复杂度仍为 O(N)。空间复杂度:O(N),每次给字符串切片都会创建一个新的字符串(字符串不可变),切片的数量受常数限制,最终复杂度为 O(N) * C = O(N)。空间复杂度:O(N),每次给字符串切片都会创建一个新的字符串(字符串不可变),切片的数量受常数限制,最终复杂度为 O(N) * C = O(N)。

m0_37900506的博客 1484

TEC 高精度控温算法:实现精准升降温与恒温控制

本文深入解析了TEC高精度控温算法的核心原理与工程实践。针对TEC非线性、时变的特性,算法通过智能状态机实现精准升降温与恒温控制,并详细阐述了参数整定、硬件协同及调试优化的系统性方法,为半导体激光器、PCR仪等高精度温控应用提供了一套完整的解决方案。

weixin_29212867的博客 999

LeetCode316. Remove Duplicate Letters——单调栈

【代码】LeetCode316. Remove Duplicate Letters——单调栈。

叶卡捷琳堡的博客 565

基于UWB技术的自动跟随避障系统设计研究

基于UWB技术的自动跟随避障系统设计研究 摘要:目前我国针对自动跟随避障系统方面的研究较少,同时国内自动跟随避障系统仍然处在未成熟阶段,多数仍停留在应用蓝牙控制或摄像头捕捉这类跟随方式,但这类方式在实际应用过程中往往会出现易受干扰,精度差,易受环境干扰等问题,这不仅会降低自动跟随避障系统的性能,同时也会对用户造成诸多困扰。因此,就需要结合目前较为有效的UWB技术,对自动跟随避障系统进行设计。基于此,本文首先将会针对UWB技术展开概述,而后对基于UWB技术的自动跟随避障系统组成展开分析,进而对基于UWB技术的

qq_43543515的博客 7987

python采集keep运动数据

我国2009年确立“全民健身日”;2012年,“广泛开展全民健身运动”写入十八大报告;到2014年上升为国家战略,全民健身的分量越来越重。推动全民健身和全民健康深度融合,通过全民健身实现全民健康。 全民健身运动在我国越来越普及,每天清晨和傍晚时分,城市的广场上、公园里,到处是运动健身的人们,跑步、打球、跳舞、游泳、打太极拳等运动项目十分丰富,人们在运动中获得越来越多的幸福感。 随之诞生出了很多运动app,例如keep,咪咕,微信等,大家可以通过app随时记录自己的运动数据,特别是对于很多的减肥人群来说,通过

Z_suger7的博客 5643

LeetCode316.Remove Duplicate Letters--贪心算法

316.Remove Duplicate Letters

Ace_15的博客 707

C++ 核电站

问题描述 一个核电站有n个放核物质的坑,排列在一条直线上。如果连续m个坑中放入核物质就会发生爆炸,所以某些坑中不能放核物质。 本题的任务:对于给定的n和m,求不发生爆炸的放置核物质的方案总数。 输入格式 第一行两个正整数n和m,之间用一个空格隔开。2≤n≤50,2≤m≤5。 输出格式 一行一个正整数,表示方案总数。 输入样例 4 3 输出样例 13 数据规模与约定 2≤n≤50,2≤m≤5 CODE #include<bits/stdc++.h> using namespace

HybridCOW_HORSE的博客 1799

[LeetCode]RemoveDuplicateLetters解题思路

一、问题描述: Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicograp

CristianoJason的博客 949

基于 Vivado HLS 的 AC97 音频系统设计

介绍一种基于 FPGA 的 AC97 音频系统设计。系统的核心部件采用 Xilinx Atlys 的板载 Spartan6 XCSLX45 芯片,使用的工具为 Xilinx 的高层 次 综 合 技 术 Vivado HLS。首先使用 C /C + + 代码编写的算法描述系统的 FIR 滤波器; 然后按 照 Vivado HLS 编译工具的规范,将程序代码转换为 RTL 模型,快速、直接地生成对 应左右声道的 FIR IP 核和综合结果; 再结合互连的 MicroBlaze 处理器 IP 核,处理 一段立体声

qq_43416206的博客 321

ESP32设备驱动-AS5600磁性旋转位置传感器

AS5600 是一款可编程的 12 位高分辨率非接触式磁性旋转位置传感器。 AS5600可以作为磁性电位器或磁性编码器使用,具有出色的可靠性和耐用性。 与传统电位器/编码器相比,AS5600具有显着优势:高精度、非接触式、旋转角度无限制。 所有这些优点使其适用于非接触式角度测量应用,例如机器人手臂、云台、电机闭环控制、机床轴定位。

视觉与物联智能 2543

[ LeetCode ] #316. Remove Duplicate Letters(移除重复出现的字符)

题目:316. Remove Duplicate Letters Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the s...

xn's blog 361

手把手教您windows如何正确的开启局域网共享,如何解决“没权限、空密码访问等诸多问题”,含手动操作教程 + 傻瓜式一键设置工具(局域网共享+打印机管理),二选一总有一款能满足您!

😫 Windows共享总失败?别抓狂!这篇教程带你破解“空密码”访问的核心难题 🔑,四步搞定所有设置。文末还附赠“一键修复”神器 🚀,让文件共享丝滑如德芙!

XiaoqiangClub的博客 1443

LeetCode #316: Remove Duplicate Letters

Problem Statement(Source) Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest i

浮生琴弦 300

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LeetCode 316. Remove Duplicate Letters

Description Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicograph...

weixin_34029680的博客 111

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

leetcode 316. remove-duplicate-letters 去除重复字母 python3

时间:2021-02-28 题目地址:https://leetcode-cn.com/problems/move-zeroes/ 题目难度:Easy 题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 思路1:快慢指针 关键点: 去重--set() 不能打乱字符的相对位置--栈结构 保

isabloomingtree的博客 318

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

316. Remove Duplicate Letters(贪心)

1.题目描述 Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical

stsfang 297

leetcode 316. Remove Duplicate Letters 去除重复字符字典序最小字符串+贪心+递归

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order a...

JackZhangNJU的专栏 4898

316. Remove Duplicate Letters (accumulate -> count of the difference elements in a vector)

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order a...

weixin_30597269的博客 88

LeetCode企业高频题库终极指南:基于真实面试数据的精准突破方案

在技术面试的战场上,算法能力已成为衡量开发者水平的关键标尺。LeetCode-Questions-CompanyWise项目通过系统化整理各大科技公司的面试题目数据,为求职者提供了宝贵的实战资源。这个开源项目包含了基于频率和时间维度分类的企业面试题库,帮助开发者针对性地准备目标公司的技术面试。通过分析近6个月、1年、2年以及全时间段的面试题目分布,项目揭示了各大科技公司的面试偏好和难度趋势。 #

gitblog_00053的博客 886
上一篇: LeetCode #153 Candy
下一篇: LeetCode #85 Maximal Rectangle
SquirrelYuyu
博客等级 码龄10年 2粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值