2024-07-20:用go语言,给定一个字符串 s, 依次遍历 ‘a‘ 到 ‘z‘, 每次操作删除 s 中出现位置最早的字符,

举报
福大大架构师每日一题 发表于 2024/07/20 21:56:59 2024/07/20
【摘要】 2024-07-20:用go语言,给定一个字符串 s,依次遍历 ‘a’ 到 ‘z’,每次操作删除 s 中出现位置最早的字符,直到 s 为空为止。返回最后一次操作前的字符串 s。举例来说,以s = "aabcbbca"为例,根据上述操作规则:第一轮操作后,s = “aabcbbca”,删除最早出现的 ‘a’、‘b’、‘c’,得 s = “abbca”。第二轮操作后,s = “abbca”,删除...

2024-07-20:用go语言,给定一个字符串 s,

依次遍历 ‘a’ 到 ‘z’,

每次操作删除 s 中出现位置最早的字符,

直到 s 为空为止。

返回最后一次操作前的字符串 s。

举例来说,以s = "aabcbbca"为例,根据上述操作规则:

第一轮操作后,s = “aabcbbca”,删除最早出现的 ‘a’、‘b’、‘c’,得 s = “abbca”。

第二轮操作后,s = “abbca”,删除最早出现的 ‘a’、‘b’、‘c’,得 s = “ba”。

第三轮操作后,s = “ba”,删除最早出现的 ‘a’、‘b’,得 s = “”。

因此最后一次操作前的字符串是"ba"。

答案2024-07-20:

chatgpt

题目来自leetcode3039。

大体步骤如下:

1.遍历字符串s,统计每个字母出现的次数以及最后一次出现的位置,并存储在cnt和last两个数组中。这个过程的时间复杂度为O(n),其中n为字符串s的长度,额外空间复杂度为O(1)。

2.找出出现次数最多的字母,记录其最后一次出现的位置。这个过程需要遍历26个小写字母,时间复杂度为O(26)≈O(1),额外空间复杂度为O(1)。

3.找到所有出现次数最多的字母对应的最后一次出现的位置,存储在ids数组中。这个过程的时间复杂度也是O(n),额外空间复杂度为O(n)。

4.对ids数组进行排序,时间复杂度为O(nlogn),额外空间复杂度为O(1)。

5.根据ids数组中的位置信息,构造出最后一次操作前的字符串t。这个过程的时间复杂度为O(n),额外空间复杂度为O(n)。

综上所述,总的时间复杂度为O(nlogn),总的额外空间复杂度为O(n)。

Go完整代码如下:

package main

import (
	"fmt"
    "slices"
)

func lastNonEmptyString(s string) string {
	var cnt, last [26]int
	for i, b := range s {
		b -= 'a'
		cnt[b]++
		last[b] = i
	}

	// 注:也可以再遍历一次 s 直接得到答案,但效率不如下面,毕竟至多 26 个数
	ids := []int{}
	mx := slices.Max(cnt[:])
	for i, c := range cnt {
		if c == mx {
			ids = append(ids, last[i])
		}
	}
	slices.Sort(ids)

	t := make([]byte, len(ids))
	for i, id := range ids {
		t[i] = s[id]
	}
	return string(t)
}


func main() {
	s:="aabcbbca"
	fmt.Println(lastNonEmptyString(s))
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

def lastNonEmptyString(s):
    cnt = [0] * 26
    last = [0] * 26

    for i, b in enumerate(s):
        b = ord(b) - ord('a')
        cnt[b] += 1
        last[b] = i

    ids = []
    mx = max(cnt)
    for i, c in enumerate(cnt):
        if c == mx:
            ids.append(last[i])

    ids.sort()

    t = [s[id] for id in ids]
    return ''.join(t)


def main():
    s = "aabcbbca"
    print(lastNonEmptyString(s))


if __name__ == "__main__":
    main()

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。