问题描述:
- 某种外星语也使用英文小写字母,但可能顺序
order
不同,字母表的顺序(order
)是一些小写字母的排列。- 给定一组用外星语书写的单词
words
,以及其字母表的顺序order
,只有当给定的单词在这种外星语中按字典序排列时,返回true
;否则,返回false
。
- 给定一组用外星语书写的单词
核心思路:
- 该题在题目上有点拗口,但实际难度并不大。
- 给定
order
其实就是按照新的顺序来排序字符,外星人按照order
的顺序来排序小写英文字母,地球人按照abcdefg...
的顺序来排序小写英文字母。 - 因此遍历
order
,将字符与其新的排序顺序进行映射保存进哈希表即可。 - 最后根据哈希表取出的字符次序大小来排序
words
中的单词即可。
- 给定
代码实现:
- 直接排序代码实现如下:
class Solution { public: bool isAlienSorted(vector<string>& words, string order) { vector<int> v(26); for(int i = 0; i < order.size(); ++i) v[order[i] - 'a'] = i; vector<string> cmp(words); sort(cmp.begin(), cmp.end(), [&](const string& a, const string& b) { for(int i = 0; i < min(a.size(), b.size()); ++i) { if(v[a[i]-'a'] > v[b[i]-'a']) return false; else if(v[a[i]-'a'] < v[b[i]-'a']) return true; } return a.size() <= b.size(); }); return cmp == words; } };
- 将字符串转化为数字字符再排序,代码实现如下:【代码贴自网友 sinlate 题解】
class Solution { public: bool isAlienSorted(vector<string>& words, string order) { unordered_map<char, int> mp; int idx = 0; for(auto c : order) mp[c] = idx++; vector<string> trans; for(auto& str : words){ string t; for(auto c : str) t += mp[c] + '0'; trans.push_back(t); } auto cp = trans; sort(cp.begin(), cp.end()); return cp == trans; } };