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

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

时间:2023-11-29 13:32:31浏览次数:54  
标签:26 cba cur 字母 cnts enter 字符串 stack size

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)
}

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

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);
}

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

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;
}

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

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_字符串_04

标签:26,cba,cur,字母,cnts,enter,字符串,stack,size
From: https://blog.51cto.com/moonfdd/8615193

相关文章

  • js 拼接字符串带变量(js方法参数单双引号拼接的问题记录)
    小结:外面单引号,里面双引号,然后方法参数给转义的单引号即可(看下面的onClick事件即可)//刷新二级信号表格(增删改操作后)functionreloadSignal(subId){//清空$("#msgAll"+subId).empty();//js手工添加表格varhtmlStart='<spanstyle="position:......
  • 字符串类型
    【二】字符串类型【0】作用字符串类型用于表示文本信息,是一种非常重要的数据类型,用于处理文字、字符等信息【1】定义方式字符串可以使用单引号、双引号或三引号进行定义#定义方式1:name_1='fyc'#(当左边有赋值符号和遍历名的时候,它就是字符串)#定义方式2:name_......
  • java字符串String类的常用方法
    java字符串String类的常用方法字符串的创建:(1)定义字符串直接赋值,在字符串池中开辟空间()Stringstr1=“Hello”;//在字符串池中写入字符串"hello"Stringstr2=“Hello”;//直接引用字符串池中的"Hello"System.out.println(str1==str2);//地址相同,输出:true(2)使用new关键字调用字......
  • SQLServer字符串查找(判断字符串是否含中文,数字或字母),并把是否含中文作为条件来执行
    转载自:SQLServer字符串查找(判断字符串是否含中文,数字或字母),并把是否含中文作为条件来执行一些操作-亟待!-博客园(cnblogs.com)从sqlserver中提取数据如何截取字符1、LOCATE(substr,str):返回子串substr在字符串str中第一次出现的位置,如果字符substr在字符串str中不......
  • C++ 查找文本文件中字符串是否存在
    简介查找文本文件中字符串是否存在代码#include<iostream>#include<fstream>#include<vector>#include<string>usingnamespacestd;boolSearchString(stringfilePath,stringstrF){vector<string>lines;stringline;ifst......
  • C++ 字符串编码转换封装函数,UTF-8编码与本地编码互转
    简介字符串编码转换封装函数,UTF-8编码与本地编码互转。中文乱码的解决方法有时候我们会遇到乱码的字符串,比如:古文码可能是用GBK方式读取UTF-8编码的中文导致的,用下面的Utf8ToLocal(stringstr)函数转换一下就可以了。口字码可能是因为以UTF-8的方式读取GBK编码的中文导致的,用下面......
  • C++ 33.C++中的字符串类-狄泰软件学院
    C语言字符串的历史C语言不支持真正意义上的字符串C语言用字符数组和一组函数实现字符串操作C语言不支持自定义类型,因此无法创建字符串类型当年C语言主要用于开发UNIX操作系统,处理字符串的情况少,所以在当时的背景下没有让C语言中内置一个字符串类型。后来C语言越用越广泛,没办法只能......
  • 数据的处理——字符串的拼接
    #1.直接用运算符拼接s1='holle's2='world'print(s1+s2)print('-'*20)#2.用字符串join()方法print(''.join([s1,s2]))#holleworld,这里是用空字符拼接,拼接的内容可以随意定义例如print('*'.join([s1,s2]))#输出结果为:holle*worldprint('-'*20)#3......
  • 字符串格式化站位 ——format
    s='helloworld'print('{0:*<20}'.format(s))#0是format的索引并且format的元素只有一个,输出字符串左对齐,右边补充以20为单位的*#结果为:helloworld**********print('{0:*>20}'.format(s))#结果为:**********helloworldprint('{0:*^20}'.format(s))#输出结果为:****......
  • 字符串的解码和编码
    #str表示字符串类型转为bytes类型(二进制类型)s='伟大的中国梦'scode=s.encode(errors='replace')#默认是utf-8,因为utf-8每个中文占3个字节print(scode)#所以输出18位字节#输出结果为:\xe4\xbc\x9f\xe5\xa4\xa7\xe7\x9a\x84\xe4\xb8\xad\xe5\x9b\xbd\xe6\xa2\xa6#用_gbk方式s......