2021-08-31:去除重复字母。给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。力扣316。

福大大 答案2021-08-31:

k种字符。
时间复杂度:O(k*N)。
空间复杂度:O(k)。

代码用golang编写。代码如下:

package main

import (
"fmt"
"strings"
) func main() {
str := "abcdea"
ret := removeDuplicateLetters1(str)
fmt.Println(ret)
ret = removeDuplicateLetters2(str)
fmt.Println(ret)
} // 在str中,每种字符都要保留一个,让最后的结果,字典序最小 ,并返回
func removeDuplicateLetters1(str string) string {
if len(str) < 2 {
return str
}
map0 := make([]int, 256)
for i := 0; i < len(str); i++ {
map0[str[i]]++
}
minACSIndex := 0
for i := 0; i < len(str); i++ {
if str[minACSIndex] > str[i] {
minACSIndex = i
}
map0[str[i]]--
if map0[str[i]] == 0 {
break
}
}
// 0...break(之前) minACSIndex
// str[minACSIndex] 剩下的字符串str[minACSIndex+1...] -> 去掉str[minACSIndex]字符 -> s'
// s'...
return fmt.Sprintf("%c", str[minACSIndex]) + strings.ReplaceAll(str[minACSIndex+1:], fmt.Sprintf("%c", str[minACSIndex]), "")
} func removeDuplicateLetters2(s string) string {
// 小写字母ascii码值范围[97~122],所以用长度为26的数组做次数统计
// 如果map[i] > -1,则代表ascii码值为i的字符的出现次数
// 如果map[i] == -1,则代表ascii码值为i的字符不再考虑
map0 := make([]int, 26)
for i := 0; i < len(s); i++ {
map0[s[i]-'a']++
}
res := make([]byte, 26)
index := 0
L := 0
R := 0
for R != len(s) {
// 如果当前字符是不再考虑的,直接跳过
// 如果当前字符的出现次数减1之后,后面还能出现,直接跳过
ok := false
if !ok {
ok = map0[s[R]-'a'] == -1
}
if !ok {
map0[s[R]-'a']--
ok = map0[s[R]-'a'] > 0
}
if ok {
R++
} else { // 当前字符需要考虑并且之后不会再出现了
// 在str[L..R]上所有需要考虑的字符中,找到ascii码最小字符的位置
pick := -1
for i := L; i <= R; i++ {
if map0[s[i]-'a'] != -1 && (pick == -1 || s[i] < s[pick]) {
pick = i
}
}
// 把ascii码最小的字符放到挑选结果中
res[index] = s[pick]
index++
// 在上一个的for循环中,str[L..R]范围上每种字符的出现次数都减少了
// 需要把str[pick + 1..R]上每种字符的出现次数加回来
for i := pick + 1; i <= R; i++ {
if map0[s[i]-'a'] != -1 { // 只增加以后需要考虑字符的次数
map0[s[i]-'a']++
}
}
// 选出的ascii码最小的字符,以后不再考虑了
map0[s[pick]-'a'] = -1
// 继续在str[pick + 1......]上重复这个过程
L = pick + 1
R = L
}
}
return string(res[0:index])
}

执行结果如下:


左神java代码

2021-08-31:去除重复字母。给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。力扣316。的更多相关文章

  1. 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  2. 剑指offer系列30-----删除链表中重复的节点

    [题目]在一个排序的链表中,存在重复的结点, * 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. * 例如,链表1->2->3->3->4->4->5 ...

  3. 链表:删除链表中重复的结点(java实现)

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  4. 剑指Offer-删除链表中重复的结点

    package LinkedList; /** * 删除链表中重复的结点 * 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. * 例如,链表1-> ...

  5. 剑指offer-删除链表中重复的节点

    题目描述   在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处 ...

  6. sql语句查询表中重复字段以及显示字段重复条数

    今天跟大家分享两条SQL语句,是关于查询某表中重复字段以及显示该字段的重复条数. 1.select * from 表名 where 列名 in (select 列名 from 表名 group by ...

  7. 剑指offer(56)删除链表中重复的节点

    一直忘记更新了,把剑指offer更新完吧.... 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3-&g ...

  8. 剑指Offer 56. 删除链表中重复的结点 (链表)

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  9. 【Java】 剑指offer(18) 删除链表中重复的结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重 ...

  10. 剑指offer五十六之删除链表中重复的结点

    一.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

随机推荐

  1. win10安装node-red遇到的问题及解决方法

    1.安装失败 原因:没有管理员权限,需要用powershell(管理员)来安装 2.安装完成后运行失败 出现下面的情况 PS C:\WINDOWS\system32> node-rednode- ...

  2. 7. 基础增删改 - 创建管理员用Model-Drive App管理后台信息 - 在Model-Driven App中创建视图

    ​ 当我们创建完Model-Driven之后,就可以在里面创建我们所需要的视图,视图一般分为三类: 个人:根据自己的个人需求创建个人视图,只有创建者和其分享的人才能查看这些视图. 公共:可以根据团体需 ...

  3. java8利用流和lambda表达式对list遍历处理

    java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组.过滤.求和.最值.排序.去重. 优点: (1) 简洁,跟之前的传统写法对比,能少写不少代码; (2) 易并行计算.尤其适用 ...

  4. vue2+element表格拖拽

    1.定义好拖拽元素 ref标识,以及 row-key="id"  (row-key拖拽标识,拖拽后数据不会乱, id为tableDataNew数据对象id) 2.下载cnpm in ...

  5. DecimalFormat--控制输出格式

    DecimalFormat的相关应用 整数的实现: 小数的实现: 科学计数法: 分组分隔符: 举个例子吧!-- 关于前缀后缀: 本地化货币符号: 引用特殊的字符,作为前缀或者后缀: 实例来袭! 1.0 ...

  6. 声网推出首个完整实时合唱解决方案 即将上线“咪哒”全国线下K歌房

    4月20日,声网Agora宣布对实时合唱技术方案全面升级,帮助国内知名迷你KTV品牌"咪哒"实现国内首个支持多终端.多人合唱.高音质的完整实时合唱解决方案的落地,结束了国内K歌行业 ...

  7. Python学习之爬虫

    又被老师要求去搞Python ,曰,,下午回顾了一下Python的基础知识,写了个爬取图片的程序,在此做个分享吧.不喜勿喷 import requests import time from bs4 i ...

  8. Object 通用方法

    Object 通用方法 概览 public final native Class<?> getClass() public native int hashCode() public boo ...

  9. 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】

    比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中. 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式 ...

  10. 【深度学习】【图像分类网络】(二)VisionTransformer

    Transformer简介 ![1png](file:///D:/资料/学习笔记/深度学习/图像分类/transformer/Self-Attention以及Multi-Head Attention/ ...