2022-04-07:给定一个只由‘a‘和‘b‘组成的字符串str, str中“ab“和“ba“子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消除的子串... 你的任务是决定一种消除的
2022-04-07:给定一个只由’a’和’b’组成的字符串str,
str中"ab"和"ba"子串都可以消除,
消除之后剩下字符会重新靠在一起,继续出现可以消除的子串…
你的任务是决定一种消除的顺序,最后让str消除到尽可能的短。
返回尽可能的短的剩余字符串。
来自阿里。
答案2022-04-07:
方法一:栈。
方法二:分别求a和b的个数,然后做差,谁多输出谁。这个方法是我另外想的,经过大量测试,准确无误。
时间复杂度:O(N)。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math/rand"
"strings"
"time"
)
func main() {
rand.Seed(time.Now().UnixMilli())
const TOTAL = 10000
sucCount := 0
for i := 0; i < TOTAL; i++ {
s := getRandString()
fmt.Println(s)
ret1 := disappear3(s)
fmt.Println("disappear3 = ", ret1)
ret2 := disappear4(s)
fmt.Println("disappear4 = ", ret2)
if ret1 == ret2 {
sucCount++
}
fmt.Println("---------------------")
}
fmt.Println("成功 = ", sucCount)
}
func disappear3(s string) string {
str := []byte(s)
n := len(str)
// 用数组结构,自己实现栈
stack := make([]int, n)
size := 0
for i := 0; i < n; i++ {
hasA := size != 0 && str[stack[size-1]] == 'a'
hasB := size != 0 && str[stack[size-1]] == 'b'
hasA = hasA || str[i] == 'a'
hasB = hasB || str[i] == 'b'
if hasA && hasB {
size--
} else {
stack[size] = i
size++
}
}
builder := make([]byte, 0)
for i := 0; i < size; i++ {
builder = append(builder, str[stack[i]])
}
return string(builder)
}
func disappear4(s string) string {
n := len(s)
acount := 0
bcount := 0
for i := 0; i < n; i++ {
if s[i] == 'a' {
acount++
} else {
bcount++
}
}
if acount >= bcount {
return strings.Repeat("a", acount-bcount)
} else {
return strings.Repeat("b", bcount-acount)
}
}
func getRandString() string {
n := 5 + rand.Intn(40)
ret := make([]byte, n)
for i := 0; i < n; i++ {
aa := rand.Intn(2)
if aa == 0 {
ret[i] = 'a'
} else {
ret[i] = 'b'
}
}
return string(ret)
}
执行结果如下:

2022-04-07:给定一个只由‘a‘和‘b‘组成的字符串str, str中“ab“和“ba“子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消除的子串... 你的任务是决定一种消除的的更多相关文章
- 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)
""" #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...
- 2018/04/07 每日一个Linux命令 之 logrotate
简介 日志的存在一直是 Linux 里面一个比较重要内容. 但是随着服务器运行的时间越来越长,日志越来越大.我见过一个线上项目 TP3.2 log文件有260+G的...... logrotate 也 ...
- 【Asp.net入门04】第一个ASP.NET 应用程序-如何添加Web窗体到网站中
添加Web窗体 本部分内容: 什么是web form 怎样添加web form 1.添加Web窗体到项目中 Web 窗体是一项 ASP.NET 功能,您可以使用它为 Web 应用程序创建用户界面.We ...
- 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等
题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0. 解法一:暴力求解.从1开始查找M,然后判断M*N=X这个数字是否只含有0,1. 解法二:由 ...
- 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...
- 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- 【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出 ...
- 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。
[题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...
- 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。
题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...
随机推荐
- 使用arcgis按掩膜批量处理MODIS.tif数据提取研究区.shp边界的python代码
在输入代码之前,需要先用arcgis把需要处理的数据导入,再把研究区shp导入,然后定义投影,先掩膜处理一个数据,再进行下一步输入代码批量处理数据的步骤.如果 不先定义投影,可能会出现输入代码不执行的 ...
- nginx配置https详细过程
准备工作 需要先准备好你域名对应的证书和私钥,也就是cert证书和key.我部署是很常见的ng+tomcat双层配置,ng作为前端的代理,所以tomcat就不需要自己处理https,ng作为代理以ht ...
- win10、win11安装子系统kali linux、图形化界面的安装
1.开启安装Linux子系统需要的扩展 Win+Q搜索功能 勾选需要的扩展,Hyper-V.Windows 虚拟机监控平台.适用于Linux的Windows子系统.虚拟机平台 反正这些有关于虚拟机的全 ...
- DVWA-Weak Session IDs(弱会话ID) 不安全的会话
在登录服务器之后,服务器会返回给用户一个会话(session),这个会话只会存在一段时间,拥有这个会话下次登录就不用输入密码就可以登录到网站,如果返回的这个会话很弱,容易被猜解到,就很不安全,照成会话 ...
- 递推求解DAG最长路径长度及最长路径条数
说明 在一般图中,求解最长路或最短路只能通过最短路算法解决 但是在DAG中,由于不存在环,因此可以通过递推,以线性复杂度计算处最长路或最短路.当然需要首先对有向图进行Tarjan缩点转化为DAG 例题 ...
- 制作一个同时具有PE和Windows原版安装方式的U盘
这个方法可能很多人已经制作成功过了,但是呢,也有些人不会的,也可能没想到过,那就是让Win PE与Windows原版安装包在一个U盘里面同时共存. 需要用到的软件有这几样:DiskGenius.Gim ...
- Module not found: Error: Can't resolve 'pubsub-js'
包未安装或者包版本过新,再者安装位置有误. 我安装各种工具库或者其他包时有个 -g 到全局的习惯,觉得装到全局时在文件夹中何时何处都可以用. 在子孙文件夹中引入时依赖会在子孙和文件根目录的node_m ...
- 淘宝商品信息定向爬虫.py(亲测有效)
import requests import re def getHTMLText(url): try: kv = { 'cookie': '', #要换成自己网页的cookie 'user-agen ...
- 机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别
1.机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别 1.1 LDA算法简介和应用 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种 ...
- es6中clss做了些什么 怎么继承
我的理解是clss实际是一种语法糖 凡是es6中clss能做的 我们通过es5也同样可以完成传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性 ...