拼多多10/11笔试第二题ac的python代码

Str = list(input())
Str1=[]
for ch in Str:
    Str1.append(ch)
Flag=0
if not Str:
    print('')
    Flag = 1
n = len(Str)
dp=[]
for i in range(n):
    if Str[i]=='a':
        dp.append('a')
        
    else:
        if not dp&nbs***bsp;dp[-1]=='b':
            dp.append('b')
        else:
            while dp and dp[-1]=='a':
                dp.pop()
            if i<n-1 and Str[i+1]!='a':
                dp.append('a')
            else:
                if 'b' not in Str[i+1:]:
                    dp.append('b')
                else:
                    dp.append('a')
for i in range(len(dp)):
    print(dp[i],end='')
第二题题意,大概是给定一个字符串,字符串全部由ab组成,如果字符串里面存在ab结构可以选择删除掉a或者删除掉b,然后求按照这样方法删除的最短字符串,如果有多个最短字符串则输出字典序最大的(比如aa和ba必须输出ba)
前面搞定输入输出加了一些没用的语句,无视掉就好
主要思想是遍历一次字符串,用一个list存放最小的字符串,‘a’的话直接append进去,b的话分情况讨论,list前一项是b的话直接append进去,是a的话,先开始删除list最后一项,直到list[-1]不等于a,然后讨论,后面的讨论是为了保持字典序最大
只会python,希望ac掉其他题的大佬也能发一下代码学习一下
抛砖引玉了蛤
#拼多多笔试##笔经##拼多多#
全部评论
这个题我是这么做的: 根据题意,可以发现字符串里开头出现的b(在第一个a出现前出现的b)与结尾出现的a(最后一个b出现后出现的a)是不可能被化简的。所以所有的字符串都可以被分为三部分:前置b,中间部分(以a开头以b结尾的若干字符),后置a。而中间部分一定可以被最终化简为b。所以我们可以用while从字符串开头遍历寻找第一个不是字符b的位置(计为headB),从结尾逆序遍历第一个不是字符a的位置(计为tailA)。 之后分情况讨论: if headB = 字符串长度 - tailA: 说明整个字符串仅由前置b与后置a组成,不可化简,就直接将这个字符串输出。 else: 答案为:先append所有前置b,再append一个b,最后append所有后置a,然后输出。 ac了所有用例,但是也没有严格的数学证明,如果有错误还请大佬们指正~
1
送花
回复
分享
发布于 2021-10-12 02:12

相关推荐

2 1 评论
分享
牛客网
牛客企业服务