题目大意
这道题是,从前往后,两两比较两个单词,如果首字母满足order顺序,则true,如果不满足,就对应位置一一比较,直到出现prev < curr -> true或者prev > curr -> false,如果以上说的情况都没有那么说明出现了类似示例 3的情况,就看长短,前面的比后面的长就返回false)
1)外星语也由 26 个英文字母组成,但是字母表顺序不是 "abc...xyz",而是重新排序后的 order。
2)现在给了一些外星语的单词 words,判断 words是不是外星语的字典序。
所谓字典序,以正常的英文字母表为例,见插图的解释:
class Solution {
public:
bool isAlienSorted(vector<string>& words, string order) {
// 用于存储每个word的每个字母在order中的顺序
vector<int> cpr(20, -1);
for(int i=0; i<words.size(); i++)
{
string temp = words[i];
for(int j=0; j<temp.size(); j++)
{
// 前一个单词j位置有字母,则判断是不是符合字典序
if(cpr[j] != -1)
{
// 当当前cpr[j]>前一个单词的cpr[j]时,则符合字典序,直接更新cpr,然后跳到下一个单词(break)
if(order.find(temp[j])>cpr[j])
{
for(int k=j; k<temp.size(); k++)
{
cpr[k]=order.find(temp[k]);
}
break;
}
else
{
// 当当前cpr[j]<前一个单词的cpr[j]时,则不符合字典序
if(order.find(temp[j])<cpr[j]) return false;
// 特殊情况,当前面的字母完全相同时,如果cpr[temp.size()]!=-1,即前一个单词比当前单词长时,也不符合字典序
if(j==temp.size()-1 && cpr[temp.size()]!=-1) return false;
}
}
cpr[j]=order.find(temp[j]);
}
}
return true;
}
};