栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

1996.打乱字母

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1996.打乱字母

Powered by:NEFU AB-IN

link

文章目录

1996.打乱字母

题意思路代码

1996.打乱字母

题意

农夫约翰将按字典序排列的 N 头奶牛的名字列表贴在了牛棚的门上。
每个奶牛的名字都由一个长度介于 1 到 20 之间的由小写字母构成的唯一字符串表示。
麻烦制造者贝茜将列表中的奶牛名字重新排序打乱了列表。
此外,她还对每头奶牛的名字中的字母顺序进行了重新排列(也可能保持不变)。
给定修改过后的列表,请帮助约翰确定列表中的每个名字可能出现在原始列表中的最低和最高位置。

思路

本题考虑用贪心,每个字符串出现的最大位置是当其他字符串字典序均最小的时候,反之亦然。

我们可以先开一个列表 l s t lst lst,用来存储所有字符串字典序最小的值,不排序

再开两个列表 l s t _ u p lst_up lst_up, l s t _ d o w n lst_down lst_down,分别存储所有字符串字典序最小和字典序最大的值,并升序排序。

在查找时,我们只需要查找每个字符串 s s s的最小字典序在 l s t _ d o w n lst_down lst_down中的位置即可得到可能出现的最小位置,反之亦然。

这里就需要用到二分

介绍 P y t h o n Python Python的库—— b i s e c t bisect bisect

bisect_left(lst_down, s), 对应lower_boundbisect_right(lst_up, s[::-1]), 对应upper_bound 代码

'''
Author: NEFU AB-IN
Date: 2022-01-09 09:51:53
FilePath: ACMAcwing1996.py
LastEditTime: 2022-01-09 11:43:36
'''
import bisect


def solve():
    n = int(input())
    lst = []
    lst_up = []
    lst_down = []
    for _ in range(n):
        s = sorted(input())
        lst.append(s)
        lst_up.append(s)
        lst_down.append(s[::-1])

    lst_up.sort()
    lst_down.sort()

    for s in lst:
        #lower_bound
        low = bisect.bisect_left(lst_down, s) + 1
        #upper_bound
        high = bisect.bisect_right(lst_up, s[::-1])
        print(low, high)


if __name__ == "__main__":
    solve()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/700996.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号