这题需要一步步来,先制作出排序表,然后再对字符串进行切割,这里可以利用一个二维数组来存放数据,同时,按照题目意思对二维数组进行顺序的教换,即可,然后再重新拼装,输出。 这里为了避免代码繁琐,最后定义一个方法来处理则两个字符串。
时间: 2024-05-08 17:16:54 浏览: 73
Python代码如下:
```python
def compare_str(s1, s2, order):
"""
比较两个字符串的大小,如果相等则按照原始顺序进行比较
:param s1: 字符串1
:param s2: 字符串2
:param order: 原始顺序列表
:return: 如果s1小于s2,则返回True,否则返回False
"""
if s1 == s2:
return order.index(s1) < order.index(s2)
i = 0
while i < min(len(s1), len(s2)):
if s1[i] != s2[i]:
return order.index(s1[i]) < order.index(s2[i])
i += 1
return len(s1) < len(s2)
def sort_words(words, order):
"""
对words按照order排序
:param words: 待排序字符串列表
:param order: 排序表
:return: 排序后的字符串列表
"""
for i in range(len(words)):
for j in range(i + 1, len(words)):
if not compare_str(words[i], words[j], order):
words[i], words[j] = words[j], words[i]
return words
def sort_alien_dictionary(words, order):
"""
对外部接口,按照order对words进行排序
:param words: 待排序字符串列表
:param order: 排序表
:return: 排序后的字符串列表
"""
# 制作出排序表
order_dict = {}
for i in range(len(order)):
order_dict[order[i]] = i
# 对字符串进行切割,利用一个二维数组来存放数据
word_list = []
for word in words:
word_list.append(list(word))
# 按照题目意思对二维数组进行顺序的教换
for i in range(len(word_list[0])):
for j in range(1, len(word_list)):
if i >= len(word_list[j]):
return []
if order_dict[word_list[j - 1][i]] > order_dict[word_list[j][i]]:
word_list[j - 1], word_list[j] = word_list[j], word_list[j - 1]
break
# 重新拼装并输出
res = []
for word in word_list:
res.append("".join(word))
return res
```
测试代码如下:
```python
words = ["hello", "leetcode", "hell", "panda", "dog"]
order = "hlabcdefgijkmnopqrstuvwxyz"
print(sort_alien_dictionary(words, order)) # ['hell', 'hello', 'leetcode', 'dog', 'panda']
words = ["z", "x", "z"]
order = "abcdefghijklmnopqrstuvwxyz"
print(sort_alien_dictionary(words, order)) # []
words = ["apple", "app"]
order = "abcdefghijklmnopqrstuvwxyz"
print(sort_alien_dictionary(words, order)) # ['app', 'apple']
words = ["app", "apple"]
order = "abcdefghijklmnopqrstuvwxyz"
print(sort_alien_dictionary(words, order)) # ['app', 'apple']
```
阅读全文