2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。

需保证 返回结果的字典序最小。

要求不能打乱其他字符的相对位置)。

输入:s = "cbacdcbc"。

输出:"acdb"。

来自左程云。

答案2023-11-29:

所有的代码用灵捷3.5编写,感觉有点抽风了,生成的代码需要修改才能运行。

大体过程如下:

1.初始化一个长度为 26 的整数数组 cnts,用于记录字符串中每个字母出现的次数。

2.初始化一个长度为 26 的布尔数组 enter,用于标记字母是否已经入栈。

3.遍历字符串 s 中的每个字符,统计每个字母出现的次数,并更新到 cnts 数组中。

4.初始化一个长度为 26 的字节数组 stack 作为栈,用于存储最终的结果。

5.初始化一个整数变量 size,表示当前栈的大小,初始值为 。

6.遍历字符串 s 中的每个字符:

6.1.将当前字符存储在变量 cur 中。

6.2.如果 cur 还未入栈,则执行以下操作:

6.2.1.判断栈是否为空或者栈顶元素小于等于 cur,或者栈顶元素在剩余字符中不再出现时退出循环。

6.2.2.将栈顶元素标记为未入栈(即 enter[stack[size-1]-'a'] 设为 false)。

6.2.3.将栈顶元素出栈。

6.2.4.更新栈的大小(即 size--)。

6.3.将 cur 入栈。

6.4.将 cur 标记为已入栈(即 enter[cur-'a'] 设为 true)。

6.5.将 cur 的出现次数减一。

7.根据栈中的元素构造移除重复字母后的结果字符串,并将其返回。

总的时间复杂度:O(n),其中 n 是字符串 s 的长度。

总的额外空间复杂度:O(1),因为使用了固定长度的数组和栈,与输入规模无关。

go完整代码如下:

package main

import "fmt"

func removeDuplicateLetters(s string) string {

	cnts := make([]int, 26)
enter := make([]bool, 26) for _, ch := range s {
cnts[ch-'a']++
} stack := make([]byte, 26)
size := 0 for i := 0; i < len(s); i++ {
cur := s[i]
if !enter[cur-'a'] {
for size > 0 && stack[size-1] > cur && cnts[stack[size-1]-'a'] > 0 {
enter[stack[size-1]-'a'] = false
size--
}
stack[size] = cur
size++
enter[cur-'a'] = true
}
cnts[cur-'a']--
} return string(stack[:size])
} func main() {
s := "cbacdcbc"
result := removeDuplicateLetters(s)
fmt.Println(result)
}

rust完整代码如下:

fn remove_duplicate_letters(s: String) -> String {
let mut cnts: [i32; 26] = [0; 26];
let mut enter: [bool; 26] = [false; 26];
let mut stack: Vec<u8> = Vec::new(); for ch in s.chars() {
cnts[(ch as u8 - b'a') as usize] += 1;
} for cur in s.bytes() {
let cur_index = (cur - b'a') as usize;
if !enter[cur_index] {
while let Some(&top) = stack.last() {
let top_index = (top - b'a') as usize;
if top > cur && cnts[top_index] > 0 {
enter[top_index] = false;
stack.pop();
} else {
break;
}
}
stack.push(cur);
enter[cur_index] = true;
}
cnts[cur_index] -= 1;
} String::from_utf8(stack).unwrap()
} fn main() {
let s = String::from("cbacdcbc");
let result = remove_duplicate_letters(s);
println!("{}", result);
}

c++完整代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <cstring> std::string removeDuplicateLetters(std::string s) {
std::vector<int> cnts(26, 0);
std::vector<bool> enter(26, false);
std::vector<char> stack(26, '\\');
int size = 0; for (char ch : s) {
cnts[ch - 'a']++;
} for (char cur : s) {
int curIndex = cur - 'a';
if (!enter[curIndex]) {
while (size > 0&& stack[size - 1] > cur && cnts[stack[size - 1] - 'a'] > 0) {
enter[stack[size - 1] - 'a'] = false;
size--;
}
stack[size] = cur;
size++;
enter[curIndex] = true;
}
cnts[curIndex]--;
} return std::string(stack.begin(), stack.begin() + size);
} int main() {
std::string s = "cbacdcbc";
std::string result = removeDuplicateLetters(s);
std::cout << result << std::endl;
return 0;
}

c完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> char* removeDuplicateLetters(char* s) {
int cnts[26] = {0};
int enter[26] = {0};
char stack[26];
int size = 0; for (int i = 0; s[i] != '\\'; i++) {
cnts[s[i] - 'a']++;
} for (int i = 0; s[i] != '\\'; i++) {
char cur = s[i];
if (!enter[cur - 'a']) {
while (size > 0&& stack[size - 1] > cur && cnts[stack[size - 1] - 'a'] > 0) {
enter[stack[size - 1] - 'a'] = 0;
size--;
}
stack[size] = cur;
size++;
enter[cur - 'a'] = 1;
}
cnts[cur - 'a']--;
} char* result = (char*)malloc(sizeof(char) * (size + 1));
memcpy(result, stack, size);
result[size] = '\\'; return result;
} int main() {
char* s = "cbacdcbc";
char* result = removeDuplicateLetters(s);
printf("%s\n", result);
free(result);
return 0;
}

2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。 需保证 返回结果的字典序最小。 要求不能打乱其他字符的相对位置)。 输入:s = “cba的更多相关文章

  1. 2015年4月27日---C语言:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!

    ---恢复内容开始--- 题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有256个.不同字符,图形不一样. 2.程序源代码: [code=c] #i ...

  2. 请求大神,C#如何截取字符串中指定字符之间的部分 按指定字符串分割 一分为二 c# 去除字符串中的某个已知字符

    string stra = "abcdefghijk";string strtempa = "c";string strtempb = "j" ...

  3. Go语言实现:【剑指offer】删除链表中重复的结点

    该题目来源于牛客网<剑指offer>专题. 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字. 示例 1: 输入: 1->2->3->3- ...

  4. BZOJ 1640 [Usaco2007 Nov]Best Cow Line 队列变换:贪心【字典序最小】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1640 题意: 给你一个长度为n的字符串. 你可以将原串的首字母或尾字母移动到新串的末尾. ...

  5. 黑盒测试实践--Day5 11.29

    黑盒测试实践--Day5 11.29 今天完成任务情况: 分析系统需求,完成场景用例设计 小组负责测试的同学学习安装自动测试工具--QTP,并在线学习操作 小黄 今天的任务是完成场景测试用例的设计.在 ...

  6. C语言学习_一个简单程序的解释与C学习方法概括

    简单计算器程序示例: # include <stdio.h> //1.头文件 //2.加法函数 int add(int a,int b)//3.函数定义方式 { //4.函数体 retur ...

  7. CAD在网页中返回当前图纸的最小外包矩形框

    主要用到函数说明: _DMxDrawX::GetMcDbDatabaseBound 返回当前图纸的最小外包矩形框,详细说明如下: 参数 说明 DOUBLE* pLbx 返回最小外包矩形框左下角X值 D ...

  8. Catenyms (POJ2337) 字典序最小欧拉路

    // 很久不写图论,连模板也不熟悉了0.0 // 这题是一个技巧性比较高的暴力DFS Catenyms 题目大意 定义catenym为首尾字母相同的单词组成的单词对, 例如: dog.gopher g ...

  9. Go语言:编写一个 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL。如果两个 URL 在 10 秒内都未返回结果,返回一个 error。

    问题: 你被要求编写一个叫做 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL.如果两个 URL 在 10 秒内都未返回结果,那么应该返回一个 error ...

  10. [poj2337]求字典序最小欧拉回路

    注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识 ...

随机推荐

  1. ElasticSearch系列——文档操作

    文章目录 Elasticsearch的增删查改(CURD) 一 CURD之Create 二 CURD之Update 三 CURD之Delete 四 CURD之Retrieve Elasticsearc ...

  2. Java 中 extends 与implements 的区别 ?

    一.介绍extends 与 implements 的概念 1.类与类之间的继承使用extends : 子类extends父类的属性和方法,并且进行扩展或者重写. // 父类 class Animal ...

  3. [GXYCTF 2019]Ping Ping Ping

    题目就是ping,而且这还有一个查询窗口,就随便查询试试 ping了一下本地,发现没有什么很大的作用,给出了提示是php可以执行系统函数这就感到神奇了,就还是上网搜了搜 发现可以在查询IP后面进行拼接 ...

  4. 记一次 openSUSE Tumbleweed 下安装 k8s

    出现的问题 因为没有K8s基础的而踩了不少坑. kubeadm kubelet 最好指定版本安装,因为kubelet的版本需要小于等于kubeadm的版本,否则就会报错. 运行 kubeadm ini ...

  5. Html文本学习内容-2

    (一)文本 1.大小写转换 text-transform属于处理文本的大小写,有4个值: none(默认值) uppercase(全部大写) lowercase(全部小写) capitalize(首字 ...

  6. html5学习内容-6(flex)

    弹性布局–flex (一)视口单位主要包括以下4个: vw:1vw等于视口宽度的1% vh:1vh等于视口高度的1% vmin:选取vm和vh中最小的那个 vmax:选取vm和vh中最大的那个 常用于 ...

  7. 批处理(Batch或离线计算)和流计算(Streaming或实时计算)

    大数据处理流程 课程:https://developer.aliyun.com/learning/course/432/detail/5385 流程 发 批处理(Batch或离线计算) 基础:goog ...

  8. 接口开放太麻烦?试试阿里云API网关吧

    前言 我在多方合作时,系统间的交互是怎么做的?这篇文章中写过一些多方合作时接口的调用规则和例子,然而,接口开放所涉及的安全.权限.监控.流量控制等问题,可不是简简单单就可以解决的,这一般需要专业的开放 ...

  9. git如何使用?初始化仓库 提交代码

    首先 国内一般使用码云 注册码云 在ui界面创建仓库 一般只有一个readme 方法一: 第一步  git clone https://gitee.com/用户个性地址/HelloGitee.git ...

  10. Vite4+Typescript+Vue3+Pinia 从零搭建(3) - vite配置

    项目代码同步至码云 weiz-vue3-template 关于vite的详细配置可查看 vite官方文档,本文简单介绍vite的常用配置. 初始内容 项目初建后,vite.config.ts 的默认内 ...