2022-04-07:给定一个只由‘a‘和‘b‘组成的字符串str, str中“ab“和“ba“子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消除的子串... 你的任务是决定一种消除的

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)


执行结果如下:


左神java代码

以上是关于2022-04-07:给定一个只由‘a‘和‘b‘组成的字符串str, str中“ab“和“ba“子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消除的子串... 你的任务是决定一种消除的的主要内容,如果未能解决你的问题,请参考以下文章

2021-07-03:给定一个只由左括号和右括号的字符串,返回最长的有效括号子串的长度。

2021-12-25:给定一个只由0和1组成的字符串S,假设下标从1开始,规定i位置的字符价值V[i]计算方式如下

c_cpp 给定一个整数数组,找到三元组,使得a ^ 2 + b ^ 2 = c ^ 2。

2022-11-01:给定一个只由小写字母和数字字符组成的字符串str。 要求子串必须只含有一个小写字母,数字字符数量随意。 求这样的子串最大长度是多少?

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

给定已知处理的聚类策略