lambda确实好用
题目要求:
将一个长度为n(1<=n<=104)的字符串分成n/k份子字符串,k为每个子字符串的长度(1<=k<=n)。每个子字符串中不能有重复的字符,并且子字符串中的字符顺序要和原始字符串相同(以先出现的字符为准,也就是ABCAB->ABC)。
我的解题思路:(1)分割字符串并不是问题,可以用切片完成。(2)子串去重,我的想法是把子串变成set类型,因为set类型是无序无重复的。然后依次查找无序无重复子串中每个字母在消除重复之前的子符串中出现的位置,并记录,最后再排序一下,就可以了。
from math import ceil
def split_tool(s:str):
#把字符串变成字典的原因是,要记录每个字母在原始字符串中出现的位置。key用的是要记录的字符,value保存位置信息,现在的值是None。
final_unordered_chr=dict.fromkeys(set(s))
#find返回原始子串中第一次出现当前字符的位置,保存到字典的相应位置。
for i in final_unordered_chr.keys():
final_unordered_chr[i]=s.find(i)
return ''.join(map(lambda x:x[0], sorted(final_unordered_chr.items(),key=lambda x:x[1])))
#最后的return由join、map、sorted三个函数组成,sorted将无序无重复的字符排序它返回的是一个排好序的队列(队列的元素是元组,每个元组有两个值,一个是我们需要返回的字符,另一个是它的位置信息,所以lambda要返回x[1]),map的作用是把队列里的元组去掉,变成一个只有我们需要字符的队列,join的参数需要一个可迭代的元素,然后将其链接成字符串。
如果有更好的方法可以给我邮件qowoq@msn.com