1.题目
问题描述
在一个超市里,有一个包含 nn 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a
到 z
表示。当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
n
:货物架的格子数m
:顾客想要购买的商品种类数s
:货物架上商品的初始顺序c
:顾客想要购买的商品种类
测试样例
样例1:
输入:
n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3
样例2:
输入:
n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:2
样例3:
输入:
n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4
2.思路
先通过测试样例看一下题目的意思
样例1:
输入:
货物架的格子数n = 3
,
顾客想要购买的商品种类数m = 4
,
货物架上商品的初始顺序s = "abc"
,
顾客想要购买的商品种类c = "abcd"
输出:
最多卖出3
件商品
此时无需调整
可以发现,将商品顺序调成和顾客想要购买的商品种类一样即可,也就是说,从货架上找出顾客想要的商品,有几件符合,将它们按序摆放,就能卖出几件。
所以,可以设置一个长度为n的数组,标记商品是否被卖出,顾客想买的商品有且没有被卖出,则该商品可卖出。
注:
- 找子串
字符串序列``.find``(子串,开始位置的下标,结束位置的下标)
3.代码
def solution(n: int, m: int, s: str, c: str) -> int:
# write code here
result = 0
flag = [False] * n
for i in range(len(c)):
for j in range(len(s)):
if c[i] == s[j] and flag[j] is False:
result += 1
flag[j] = True
return result
s="acabacccaabbcca"
c="tvbaecosivjdocp"
你的输出=15
预期输出=4
注意每个字符只允许匹配一次,成功匹配后break
def solution(n: int, m: int, s: str, c: str) -> int:
# write code here
result = 0
flag = [False] * n
for i in range(len(c)):
for j in range(len(s)):
if c[i] == s[j] and flag[j] is False:
result += 1
flag[j] = True
break
return result
if __name__ == '__main__':
print(solution(3, 4, "abc", "abcd") == 3)
print(solution(4, 2, "abbc", "bb") == 2)
print(solution(5, 4, "bcdea", "abcd") == 4)