日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2023/11/30 60 coder

2023-11-29:用go語(yǔ)言,給你一個(gè)字符串 s ,請(qǐng)你去除字符串中重復(fù)的字母,使得每個(gè)字母只出現(xiàn)一次。

需保證 返回結(jié)果的字典序最小。

要求不能打亂其他字符的相對(duì)位置)。

輸入:s = "cbacdcbc"。

輸出:"acdb"。

來(lái)自左程云。

答案2023-11-29:

所有的代碼用靈捷3.5編寫(xiě),感覺(jué)有點(diǎn)抽風(fēng)了,生成的代碼需要修改才能運(yùn)行。

大體過(guò)程如下:

1.初始化一個(gè)長(zhǎng)度為 26 的整數(shù)數(shù)組 cnts,用于記錄字符串中每個(gè)字母出現(xiàn)的次數(shù)。

2.初始化一個(gè)長(zhǎng)度為 26 的布爾數(shù)組 enter,用于標(biāo)記字母是否已經(jīng)入棧。

3.遍歷字符串 s 中的每個(gè)字符,統(tǒng)計(jì)每個(gè)字母出現(xiàn)的次數(shù),并更新到 cnts 數(shù)組中。

4.初始化一個(gè)長(zhǎng)度為 26 的字節(jié)數(shù)組 stack 作為棧,用于存儲(chǔ)最終的結(jié)果。

5.初始化一個(gè)整數(shù)變量 size,表示當(dāng)前棧的大小,初始值為 。

6.遍歷字符串 s 中的每個(gè)字符:

6.1.將當(dāng)前字符存儲(chǔ)在變量 cur 中。

6.2.如果 cur 還未入棧,則執(zhí)行以下操作:

6.2.1.判斷棧是否為空或者棧頂元素小于等于 cur,或者棧頂元素在剩余字符中不再出現(xiàn)時(shí)退出循環(huán)。

6.2.2.將棧頂元素標(biāo)記為未入棧(即 enter[stack[size-1]-'a'] 設(shè)為 false)。

6.2.3.將棧頂元素出棧。

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

6.3.將 cur 入棧。

6.4.將 cur 標(biāo)記為已入棧(即 enter[cur-'a'] 設(shè)為 true)。

6.5.將 cur 的出現(xiàn)次數(shù)減一。

7.根據(jù)棧中的元素構(gòu)造移除重復(fù)字母后的結(jié)果字符串,并將其返回。

總的時(shí)間復(fù)雜度:O(n),其中 n 是字符串 s 的長(zhǎng)度。

總的額外空間復(fù)雜度:O(1),因?yàn)槭褂昧斯潭ㄩL(zhǎng)度的數(shù)組和棧,與輸入規(guī)模無(wú)關(guān)。

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

總結(jié)

以上是生活随笔為你收集整理的2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。 需保证 返回结果的字典序最小。 要求不能打乱其他字符的相对位置)。 输入:s = “cba的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。