Python编程题40--验证字母表的顺序
题目
给定一个含有多个字符串的列表 words,以及自定义字母表的顺序 order,只有当列表中的所有字符串均按order中的字典序排列时,返回 true;否则,返回 false。
例如:
给定一个列表words:["hello", "leetcode"],自定义字母表的顺序 order:"hlabcdefgijkmnopqrstuvwxyz"
返回结果:true解释:在自定义字母表的顺序中,'h' 位于 'l' 之前,所以列表是按字典序排列的
给定一个列表words:["word", "world", "row"],自定义字母表的顺序 order:"worldabcefghijkmnpqstuvxyz"
返回结果:false解释:在自定义字母表的顺序中,'d' 位于 'l' 之后,那么 words[0] > words[1],所以列表不是按字典序排列的
说明:
- 在 words[i] 和 order 中的所有字符都是英文小写字母
- 对于空白字符,定义为比其他字符都要小,比如当 "apple" 和 "app" 进行比较,前3个字符完全相同,然后 "apple" 的第4个字符需要和空白字符比较,最终结果是 "app" 排列在 "apple" 前面
实现思路1
- 首先使用一个字典存储order中所有字母及其顺序,然后再通过两层循环判断列表排序是否正确
- 第一层循环,对列表进行遍历,每次都取当前遍历的字符串 words[i] 与其下一个字符串 words[i+1];第二层循环,对这两个字符串进行比较,判断排序是否正确
- 比较的两个字符串中,如果当前字符串的下标 j下的字符,字典序大于 下一个字符串的下标 j下的字符,那么说明列表排序错误,直接返回 False
- 比较的两个字符串中,如果当前字符串的下标 j下的字符,字典序等于 下一个字符串的下标 j下的字符,需继续比较它们下标 j+1字符
- 比较的两个字符串中,如果当前字符串的下标 j下的字符,字典序小于 下一个字符串的下标j下的字符,则说明这2个字符串排序正确,跳出当前循环
代码实现1
def isDiySorted(words, order):
tmp_dict = {c: i for i, c in enumerate(order)} # order字典序
for i in range(len(words) - 1):
len1, len2 = len(words[i]), len(words[i + 1])
order1, order2 = tmp_dict.get(words[i][0]), tmp_dict.get(words[i + 1][0])
min_word_length = len1
if len1 > len2:
# 如果下一个字符串(如 app )恰好等于当前字符串的前部分(如 apple )
if words[i + 1] == words[i][:len2]:
return False
min_word_length = len2
for j in range(min_word_length):
order1, order2 = tmp_dict.get(words[i][j]), tmp_dict.get(words[i + 1][j])
if order1 > order2: # 如果当前字符串的下标 j下的字符,字典序大于 下一个字符串的下标 j下的字符
return False
elif order1 == order2: # 如果当前字符串的下标 j下的字符,字典序等于 下一个字符串的下标j下的字符,需继续比较 j+1字符
continue
else: # 其他情况则说明当前比较的字符串排序正确,直接跳出当前比较循环
break
return True
实现思路2
- 先使用一个字典存储order中所有字母及其顺序
- 再利用Python的内置函数
sorted()
对列表words进行排序 - 如果排序后的列表,与原列表words顺序完全一致,则说明原列表排序正确返回True,否则返回False
代码实现2
def isDiySorted(words, order):
"""
sorted()函数中的参数 key 可传入一个函数,这里 key=lambda word: [tmp_dict.get(i) for i in word]
sorted()函数把 words 中的每个元素均传入到 key 的函数中,然后会返回一个列表,该列表包括有当前元素中每个字符的字典序下标 tmp_dict.get(i) ,均为数字
当每个元素都返回对应的字典序下标列表后,因为其列表元素都是数字,sorted()函数会自动对其进行默认排序
"""
tmp_dict = {c: i for i, c in enumerate(order)} # order字典序
return words == sorted(words, key=lambda word: [tmp_dict.get(i) for i in word])
更多Python编程题,等你来挑战:Python编程题汇总(持续更新中……)
作者:wintest
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出原文链接,并保留此段声明,否则保留追究法律责任的权利。