字节跳动2018后端开发编程题-字母交换

字母交换

https://www.nowcoder.com/questionTerminal/43488319efef4edabada3ca481068762

题目

字符串S由小写字母构成,长度为n。定义一种操作,每次都可以挑选字符串中任意的两个相邻字母进行交换。询问在至多交换m次之后,字符串中最多有多少个连续的位置上的字母相同?

我的思路

实际在做题的时候主要分为三部分
1.按序接受输入的参数
2.对于字母的处理
由于是只有小写字母,而且后面解决问题时,只涉及到同类字母的出现位置,所以我使用了一个dict来进行存储字母以及相应的位置信息(键 为字母,值为 出现位置 的list)
3.对于整理好同类字母以及其对应的位置信息后,寻找递推式,使用动态规划dp
根据实例,可以得出 同一个字母的位置列表(假定为arr)中其一些规律,i,和j为数组索引,dp[i][j]表示使得arr[i]和arr[j]相邻的最少交换次数
(1) i==j 是,表示的是一个字符,这个时候不需要交换就能相邻,dp[i][j]=0
(2)两两相邻的元素arr[i],arr[j],要在实际的S中,使得他们相邻,要交换的次数为arr[j]-arr[i]-(j-i)
(3)不相邻的元素arr[i],arr[j],那么dp[i+1][j-1]+arr[j]-arr[i]-(j-i)
也就是说,往中间靠拢,先得到使得中间是连续字符要交换的次数+当前次数。
为什么(2)(3)中,都要减去(j-i)呢,这个得到的是中间该字母出现的次数,我们默认中间是靠拢了的,所以要减去中间该字母出现的次数

具体实现


import sys
line=sys.stdin.readline().strip()
s,n=line.split()
n=int(n)
se=set(s)
res=1
sdict={}
for i in se:
sdict[i]=[]
for j in range(len(s)):
sdict[s[j]].append(j)
forcinse:
dp=[]*len(sdict[c])
foriinrange(len(sdict[c])):
dp.append([0]*len(sdict[c]))
#for i in range(len(sdict[c])):
#dp[i][i]=0
foriinrange(0,len(sdict[c])-1):
#print(i)
forjinrange(i+1,len(sdict[c])):
rr=sdict[c][j]-sdict[c][i]-(j-i)
ifi+1!=j:
rr+=dp[i+1][j-1]
dp[i][j]=rr
ifdp[i][j]<=n:
#print('change',i,j,dp[i][j],res,j-i+1)
res=max(res,j-i+1)
print(res)

另外对于解题思路部分,中的(3),我花了很多时间
(1)一开始使用的是穷举法
(2)对于dp,我开始的时候用的是一维数组存储dp,我以为只要解决dp[0][j]即可,但是题目的解也有可能出现在 dp[i][j]中
(3)在python3中声明一个大小确定的二维数组确实不太elegant,难怪看到解题的回答中,都没有使用python的
(4)后面测试通过率只有85%,实在不太明白,我看了下其他用c++实现的解法,是差不多的思路

全部评论

相关推荐

搜索部&nbsp;首先说下timeline8.18,投递8.19,约一面8.21,晚上一面call约二面8.22,上午二面下午oc周末等待(8.23,8.24)8.25,offer一年前,我还是懵懵懂懂,高考完的暑假,只会提前学学高数,未来的画像是什么?我或许无法预测。开学后,自学Python,接单,无数个客户的ddl,偷偷摸摸一个人找自习的地方,这一步步竟然为后来的我,搭建工程能力的基础。大一上,我也要感谢我的第一位老板,让我接触到了实习,师兄带着我一步步入门,看他们写的飞书文档。大一下,导师带我参与企业项目,这让我渐渐发现,应该去实践,增长见识,而非局限当下,盯着自己的小新pro。不久后,第一波投递开始,结果当然是约面极少。盯着简历上的文字和ssob,我开始思考,确实很多可以去提升。带着些许不甘心,继续沉淀,慢慢的约面也越来越多,有的时候两天7场,准备完就接着下一个日程。这一次,也许是刚好到位吧,比较match,面试答的流利,关关难关关过,成为度孝子展望未来,依然是重重挑战,果然只有收到offer的那一刻是开心的。愿在百度星海拆解的每一段代码,都能成为丈量宇宙的诗行;此志终赴星河,而今迈步重铸天阶。屏幕前的你们,在无数个向星海奔赴的日夜,一定一定,会在未来化作群星回响的征程——请永远相信此刻埋首耕耘的自己!!!
一天三顿半:???百度提前批发 offer了?不是统一和正式批排序完再发吗我靠
百度求职进展汇总
点赞 评论 收藏
分享
AC鸽想进大厂:你是我见过最美的牛客女孩
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务