蓝桥杯试题之算法提高 最小字符串

试题 算法提高 最小字符串

资源限制

时间限制:2.0s 内存限制:256.0MB

问题描述

  给定一些字符串(只包含小写字母),要求将他们串起来构成一个字典序最小的字符串。

输入格式

  第一行T,表示有T组数据。
  接下来T组数据
  每组第一行一个正整数n,表示字符串个数。
  接下来n行,每行一个字符串(长度不超过100)。

输出格式

  T行,每行一个字符串。

样例输入

1
3
a
b
c

样例输出


 abc


数据规模和约定

  T<=7000,n<=100;


思路

        本题其实并不复杂,主要考查贪心的知识点,什么是字典序最小?越小的字符越在前面时组成的字符串的字典序不就越小了!不过这里需要注意就是我们不能从单一字符个体之间去考虑和比较,而是要以完整的字符串为个体去考虑两两之间的先后次序。举个例子:字符串s1(len(s1)>=1)和字符串s2(len(s2)>=1)谁能排在前面呢?答案就是看(s1+s2)小还是(s2+s1)小,前者小的话就是s1在s2前面啦,同理,反之则是s2在s1前面。那么新的问题又来了,如何比较大小呢,难道能直接对比咩?答案是YES!Python可以直接比较两字符串之间的大小,返回值为布尔值~(关于对比原理这里暂时就不再延伸了)。

        因此本题到这里一下子就简单了许多有木有,因为我们已经把贪心问题转化为字符串之间的大小排序问题,进一步形象点说就是我们可以将每一个字符串整体当作一个对象,然后对于每一个对象个体来说,比“我”小就去“我”前面呗~。不过要怎样将其当作一个对象个体然后去排序呢(暴力会超时)。

        这个地方我们可以采用类对象的写法,直接在对象中封装一个排序方法(规则就是我们上面所说的),接着将输入的每一行字符串转为对象,放入容器中后调用方法进行排序即可,之后容器内就是一个个按从小到大的顺序排序的元素了,剩下的就不用操心啦~

代码

'''
    @Author Rrong
    @Date : 2022/03/20

'''
class STR:
    def __init__(self,s):
        self.s = s
    def __lt__(self, other):
        if self.s + other.s < other.s + self.s:    
            return True         # 比"我"小就去"我"前面
        else:
            return False        # 比"我"大就去"我"后面

def Input_objStrs(T):           
    objStrs = []                # 存放T组字符串对象列表的容器
    for t in range(T):
        objStrs.append([])      # 容器内添加一个空的字符串对象列表
        n = int(input())
        for i in range(n):
            objStrs[t].append(STR(input()))
    return objStrs             

def main():
    T = int(input())
    objStrs = Input_objStrs(T)  # 获取已经存放了T组字符串对象列表的容器
    for objStr in objStrs:      # objStr就是第T组字符串对象列表
        objStr.sort()           # 调用__lt__方法进行排序
        s = ''    
        for i in objStr:
            s += i.s
        print(s)                
main()

个人可能会发一些关于蓝桥杯题目的Python题解(比较少有答案的题目)

第一次写博客,经验尚浅,表达不恰之处望海涵,请批评指正!

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值