2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。 需保证 返回结果的字典序最小。 要求不能打乱其他字符的相对位置)。 输入:s = “cba
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运维初级实践——Linux系统命令教程
- 下一篇: 机密计算如何引领AI开发的安全未来