网易首页 > 网易号 > 正文 申请入驻

2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开

0
分享至

2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。

花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串

定义下面几条语法规则:

如果只给出单一的元素 x,那么表达式表示的字符串就只有 "x"。R(x) = {x}

例如,表达式 "a" 表示字符串 "a"。

而表达式 "w" 就表示字符串 "w"。

当两个或多个表达式并列,以逗号分隔,我们取这些表达式中元素的并集

R({e_1,e_2,...}) = R(e_1) ∪ R(e_2) ∪ ...

例如,表达式 "{a,b,c}" 表示字符串 "a","b","c"。

而表达式 "{{a,b},{b,c}}" 也可以表示字符串 "a","b","c"。

要是两个或多个表达式相接,中间没有隔开时,

我们从这些表达式中各取一个元素依次连接形成字符串

R(e_1 + e_2) = {a + b for (a, b) in R(e_1) × R(e_2)}

例如,表达式 "{a,b}{c,d}" 表示字符串 "ac","ad","bc","bd"。

表达式之间允许嵌套,单一元素与表达式的连接也是允许的。

例如,表达式 "a{b,c,d}" 表示字符串 "ab","ac","ad"

例如,表达式 "a{b,c}{d,e}f{g,h}"

可以表示字符串 :

"abdfg", "abdfh", "abefg", "abefh",

"acdfg", "acdfh", "acefg", "acefh"。

给出表示基于给定语法规则的表达式 expression。

返回它所表示的所有字符串组成的有序列表。

输入:expression = "{a,b}{c,{d,e}}"。

输出:["ac","ad","ae","bc","bd","be"]。

答案2023-07-13:

大体步骤如下:

1.定义了一个结构体,其中包含一个类型的指针和一个整数。

Info

treeset.Set

ans

end

2.定义了一个函数,用于初始化对象。

NewInfo

Info

3.定义了函数,接收一个表示表达式的字符串,并返回展开后的字符串列表。

braceExpansionII

4.函数是实际处理展开过程的核心函数,它接收一个表示表达式的字符数组和一个起始索引,返回一个对象。

process

exp

start

Info

5.在函数中,创建了一个空的对象和一个空的切片。

process

treeset.Set

ans

[]*treeset.Set

parts

6.使用创建了一个字符串构建器。

strings.Builder

builder

7.在循环中,依次遍历中的字符,直到遇到或到达字符串末尾为止。

exp

8.如果当前字符为,则调用函数将构建器中的字符串添加到中,并递归调用函数处理内部的表达式,将返回的添加到中,并更新起始索引。

addStringToParts

parts

process

ans

parts

start

9.如果当前字符为,则调用函数将构建器中的字符串添加到中,并将中的所有集合添加到中,然后清空,并更新起始索引。

addStringToParts

parts

parts

ans

parts

start

10.如果当前字符为小写英文字母,则将其添加到构建器中。

11.循环结束后,调用函数将构建器中的最后一个字符串添加到中。

addStringToParts

parts

12.调用函数将中的所有集合添加到中。

addPartsToSet

parts

ans

13.返回包含和起始索引的对象。

ans

start

Info

14.函数将构建器中的字符串添加到中,如果构建器不为空,则创建一个新的对象,并将字符串添加到集合中,再将集合添加到中。

addStringToParts

parts

treeset.Set

parts

15.函数将中的所有集合进行组合并添加到中。

addPartsToSet

parts

ans

16.函数是递归处理切片的核心函数。如果索引等于的长度,则表示已经处理完所有集合,将连接后的字符串添加到中。否则,取出当前集合,遍历集合中的每个元素,与进行连接,并递归调用处理下一个集合。

processParts

parts

i

parts

ans

path

processParts

17.函数将中的元素转换为有序字符串切片,并返回该切片。

toSlice

ans

18.在函数中,定义了一个表达式字符串,并调用函数对表达式进行展开,并将结果打印输出。

main

expression

braceExpansionII

该代码的时间复杂度为$O(N^M)$,其中N为表达式中的字符数,M为展开括号的深度。具体来说,代码中的核心函数通过遍历表达式字符并进行递归处理,每次递归都会将问题规模缩小,直到达到展开括号的最深层级。因此,时间复杂度取决于表达式中字符的数量以及展开括号的深度。

process

空间复杂度是$O(N^M)$,其中N为表达式中的字符数,M为展开括号的深度。在代码执行过程中,会创建一些辅助数据结构,如字符串构建器和集合。对于集合这种动态数据结构,其占用的内存空间与展开括号的深度呈指数关系。而字符串构建器的空间复杂度与表达式中字符的数量成线性关系。因此,最终的空间复杂度取决于展开括号的深度和表达式中字符的数量,即$O(N^M)$。

go完整代码如下:

packagemain
import(
"fmt"
"strings"
"github.com/emirpasic/gods/sets/treeset"
)
typeInfostruct{
ans*treeset.Set
endint
}
funcNewInfo(a*treeset.Set,eint)*Info{
ans:=&Info{}
ans.ans=a
ans.end=e
returnans
}
funcbraceExpansionII(expressionstring)[]string{
ans:=process([]rune(expression),0).ans
returntoSlice(ans)
}
funcprocess(exp[]rune,startint)*Info{
ans:=treeset.NewWith(func(a,binterface{})int{
aa:=a.(string)
bb:=b.(string)
ifaareturn-1
}elseifaa==bb{
return0
}else{
return1
}
})
parts:=make([]*treeset.Set,0)
builder:=strings.Builder{}
forstartifexp[start]=='{'{
addStringToParts(&builder,&parts)
next:=process(exp,start+1)
parts=append(parts,next.ans)
start=next.end+1
}elseifexp[start]==','{
addStringToParts(&builder,&parts)
addPartsToSet(ans,&parts)
start++
parts=make([]*treeset.Set,0)
}else{
builder.WriteRune(exp[start])
start++
}
}
addStringToParts(&builder,&parts)
addPartsToSet(ans,&parts)
return&Info{ans,start}
}
funcaddStringToParts(builder*strings.Builder,parts*[]*treeset.Set){
ifbuilder.Len()!=0{
s:=treeset.NewWithStringComparator()
s.Add(builder.String())
*parts=append(*parts,s)
builder.Reset()
}
}
funcaddPartsToSet(ans*treeset.Set,parts*[]*treeset.Set){
processParts(parts,0,"",ans)
}
funcprocessParts(parts*[]*treeset.Set,iint,pathstring,ans*treeset.Set){
ifi==len(*parts){
ifpath!=""{
ans.Add(path)
}
}else{
part:=(*parts)[i]
it:=part.Iterator()
forit.Next(){
cur:=it.Value().(string)
processParts(parts,i+1,path+cur,ans)
}
}
}
functoSlice(set*treeset.Set)[]string{
slice:=make([]string,0)
it:=set.Iterator()
forit.Next(){
slice=append(slice,it.Value().(string))
}
returnslice
}
funcmain(){
expression:="{a,b}{c,{d,e}}"
result:=braceExpansionII(expression)
fmt.Println(result)
}

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
打进本届美洲杯首球,阿尔瓦雷斯当选阿根廷vs加拿大全场最佳

打进本届美洲杯首球,阿尔瓦雷斯当选阿根廷vs加拿大全场最佳

懂球帝
2024-06-21 10:58:16
华为研发薪酬先进到了什么程度?

华为研发薪酬先进到了什么程度?

互联网早读课
2024-06-21 08:08:44
刘国梁曾经采访时谈到马琳:“不少球员都表示和马琳打一场球下来在厕所都会嗷嗷吐

刘国梁曾经采访时谈到马琳:“不少球员都表示和马琳打一场球下来在厕所都会嗷嗷吐

阿牛体育说
2024-04-30 07:30:08
雷霆换来卡鲁索获评高分A!亚历山大明年冲冠更有底气了?

雷霆换来卡鲁索获评高分A!亚历山大明年冲冠更有底气了?

罗说NBA
2024-06-21 10:35:35
欧洲杯历史上最合格的死亡之组——两轮之后最弱球队依然有望晋级

欧洲杯历史上最合格的死亡之组——两轮之后最弱球队依然有望晋级

刺头体育
2024-06-20 12:33:58
菲律宾突击艇加装钢板!

菲律宾突击艇加装钢板!

青年的背包
2024-06-12 21:04:53
4年3200万美金!湖人疯狂签约,魔术师看清现实,老詹太难了

4年3200万美金!湖人疯狂签约,魔术师看清现实,老詹太难了

世界体育圈
2024-06-21 10:31:28
中小学将恢复“留级制度”?教育部正式回应,一锤定音!

中小学将恢复“留级制度”?教育部正式回应,一锤定音!

华人星光
2024-06-20 16:40:07
美国顶级预言家再出手!直言2024美日中命运!这个岛最先出事!

美国顶级预言家再出手!直言2024美日中命运!这个岛最先出事!

飞云如水
2024-06-09 21:53:34
为什么我感受不到1500元的手机比四五千的差?看网友的经典评论

为什么我感受不到1500元的手机比四五千的差?看网友的经典评论

滑稽斑马呀
2024-06-20 19:39:58
33岁大龄剩女认为男生挣100万很容易,网友:剩女为啥对钱没概念?

33岁大龄剩女认为男生挣100万很容易,网友:剩女为啥对钱没概念?

风起云间
2024-06-19 21:47:40
热闻|柳州两任市委书记同日被通报,此前为“老搭档”,曾同受处分

热闻|柳州两任市委书记同日被通报,此前为“老搭档”,曾同受处分

齐鲁壹点
2024-06-20 14:13:31
非鲁能的泽卡!泰山队新来中锋浮出水面,现已身披战袍出镜

非鲁能的泽卡!泰山队新来中锋浮出水面,现已身披战袍出镜

谈谈体坛那些事
2024-06-21 10:37:40
姜萍决赛的挑战!

姜萍决赛的挑战!

新动察
2024-06-19 09:45:42
外交豁免权事件再升级!余琦被立案调查,其人品也被前同事曝光!

外交豁免权事件再升级!余琦被立案调查,其人品也被前同事曝光!

暖心的小屋
2024-06-20 21:25:32
中国经济的非市场化行为:房地产是一个隐喻

中国经济的非市场化行为:房地产是一个隐喻

永不出场的戈多
2024-05-11 09:34:24
南京市委书记这篇在南京·大学生毕业典礼上的致辞,金句满满!

南京市委书记这篇在南京·大学生毕业典礼上的致辞,金句满满!

我是娱有理
2024-06-21 07:18:27
记住,与任何人相处,你越“这样”,别人就越不敢惹你。

记住,与任何人相处,你越“这样”,别人就越不敢惹你。

户外阿崭
2024-05-11 15:38:50
我爸,一个快60岁的老头,消费观崩塌了。

我爸,一个快60岁的老头,消费观崩塌了。

悠闲葡萄
2024-06-20 11:07:48
广州人在广州,被剥夺粤语权利,母语变无语

广州人在广州,被剥夺粤语权利,母语变无语

广州PLUS
2024-06-20 19:22:16
2024-06-21 11:34:44
moonfdd
moonfdd
福大大架构师每日一题
428文章数 7关注度
往期回顾 全部

科技要闻

美媒:苹果正与百度阿里百川等谈AI合作

头条要闻

环球:欧盟若对华抡起贸易大棒 中国不会被动挨打

头条要闻

环球:欧盟若对华抡起贸易大棒 中国不会被动挨打

体育要闻

1-0"吊打"意大利 西班牙这就叫冠军相?

娱乐要闻

陈晓惹争议!被曝婚变离家出走冷暴力

财经要闻

普华永道,引火烧身

汽车要闻

售价11.79-14.39万元 新一代哈弗H6正式上市

态度原创

本地
旅游
时尚
教育
公开课

本地新闻

2024·合肥印象|用崭新视角对话城市发展

旅游要闻

铁路儿童票新规 已有超4900万小旅客免费出行

黑色的透视单品,就选这6件!

教育要闻

一手拿画笔,一手带娃,当画画成为全职妈妈的“出口”

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版