题目
思路
这道题的题干是和子序列相关的,并且最后要求出同等长度的子序列中字典序最小的情况。考虑借用栈这种数据结构,栈中储存当前的一个可行解。遍历字符串,如果遇到当前字符比栈顶字符字典序小的情况,就尽量多得从栈中弹出原有元素,最后再将该元素加入。不过这里 有两个细节需要考虑,一是如果当前栈中元素个数还未达到k值,则即使没有元素出栈,当前元素也应该入栈;二是出栈的时候需要考虑剩下元素与栈中还需要填充元素个数的关系,如果剩下的元素个数只够刚好填充栈使栈中元素达到k值的话,那么此时就不能再弹出元素,否则最后无法满足题意。
代码
class Solution:
def mostCompetitive(self, nums: List[int], k: int) -> List[int]:
q=[]
n=len(nums)
if n==1:
return nums
q.append(nums[0])
for i in range(1,n):
flag=0
while q and nums[i]<q[-1]:
flag=1
if k-len(q)==n-i: #检验剩下的元素个数与栈中需要填充元素个数的关系
break
q.pop()
if flag:
q.append(nums[i])
elif not flag and len(q)<k:
q.append(nums[i])
return q