试题 算法提高 最小字符串
资源限制
时间限制: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题解(比较少有答案的题目)
第一次写博客,经验尚浅,表达不恰之处望海涵,请批评指正!