题目链接 :LCR 034. 验证外星语词典 - 力扣(LeetCode)
题目:
有一门外星语言,它的字母表刚好包含所有的英文小写字母,只是字母表的顺序不同。给定一组单词和字母表顺序,请判断这些单词是否按照字母表的顺序排序。例如,输入一组单词 ["offer", "is", "coming"],以及字母表顺序 "zyxwvutsrqponmlkjihgfedcba",由于字母 'o' 在字母表中位于 'i' 的前面,因此单词 "offer" 排在 "is" 前面;同样,由于字母 'i' 在字母表中位于 'c' 的前面,因此单词 "is" 排在 "coming" 的前面。因此,这组单词是按照字母表顺序排序的,应该输出 true。
分析:
首先分析如何按照常规字母表的顺序确定英文单词的顺序。例如,两个单词 "offer" 和 "often",它们前面的两个字母都是相同的,分别是 'o' 和 'f'。它们的第三个字母,一个是 'f',另一个是 't'。在常规字母表中,字母 'f' 的位置在 't' 的前面(即 'f' < 't'),因此,单词 "offer" 应该排在 "often" 的前面。
但目前字母表的顺序由一个输入的字符串决定。在确定单词排序的顺序时,它们的每个字母在该字母表中的顺序至关重要。为了方便查找每个字母在字母表中的顺序,可以创建一个哈希表,哈希表的键为字母表的每个字母,而值为字母在字母表中的顺序。
由于字母表中的字母数目是固定的,总共 26 个,因此可以用一个长度为 26 的数组来模拟哈希表,数组的下标对应哈希表的键,而数组的值对应哈希表的值。
代码实现:
cpp
class Solution {
private:
bool isSorted(const string& word1, const string& word2, const vector<int>& orderArr) {
int i = 0;
while (i < word1.size() && i < word2.size())
{
if (orderArr[word1[i] - 'a'] < orderArr[word2[i] - 'a'])
return true;
if (orderArr[word1[i] - 'a'] > orderArr[word2[i] - 'a'])
return false;
++i;
}
return i == word1.size();
}
public:
bool isAlienSorted(vector<string>& words, string order) {
vector<int> orderArr(26, 0); // 用数组模拟哈希表
for (int i = 0; i < order.size(); ++i)
{
orderArr[order[i] - 'a'] = i;
}
for (int i = 0; i < words.size() - 1; ++i)
{
if (!isSorted(words[i], words[i + 1], orderArr))
return false;
}
return true;
}
};