思路:
1. 数组模拟哈希,数组下标代表字母,值代表该字母在字母表中的位置;
2. 扫描两个单词中的字母找出第一个不相同的字母,哪个单词中第一个不相同的字母位置靠前,排序的时候它就在前面,如果没有找到不相同的字母,那么短的单词排在前面。
class Solution {
public:
bool isAlienSorted(vector<string>& words, string order) {
vector<int> orderArray(26, 0);
for (int i = 0; i < order.length(); ++ i)
{
orderArray[order[i] - 'a'] = i; //数组模拟哈希
}
for (int i = 0; i < words.size() - 1; ++ i)
{
if (!isSorted(words[i], words[i + 1], orderArray))
{
return false;
}
}
return true;
}
bool isSorted(string& word1, string& word2, vector<int>& orderArray)
{
int i = 0;
for (; i < word1.length() && i < word2.length(); ++ i)
{
if (orderArray[word1[i] - 'a'] > orderArray[word2[i] - 'a'])
{
return false;
}
if (orderArray[word1[i] - 'a'] < orderArray[word2[i] - 'a'])
{
return true;
}
}
//退出循环时,i等于俩单词中较短单词的长度
return i == word1.length(); //短的单词应该排前面,所以最后要判断前面的单词是否是短的
}
};