某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。
给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。
输入:words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz"
输出:true
解释:在该语言的字母表中,'h' 位于 'l' 之前,所以单词序列是按字典序排列的。
提示:
1 <= words.length <= 100
1 <= words[i].length <= 20
order.length == 26
在 words[i] 和 order 中的所有字符都是英文小写字母。
我的第一个想法子就是存所有的字母到map里面,然后把所有的字符串转换成数字字符串,比较大小(这是固定的时间复杂度
class Solution {
public:
bool isAlienSorted(vector<string>& words, string order) {
vector<string>str;
int n = words.size();
map<char,int>trans;
for(int i=0;i<26;++i)
{
pair<int,char>t={order[i],i};
trans.insert(t);
}
for(int i=0;i<n;++i)
{
string t="";
for(int j=0;j<words[i].length();++j)
{
t+=toString(trans[words[i][j]]);
}
str.push_back(t);
}
for(int i=0;i<str.size()-1;++i)
{
if(str[i]<str[i+1])
return false;
}
return true;
}
};
然后看了一眼题解:有一个小优化,不用转化每一个串的全部字符,优化了时间复杂度还有空间的
class Solution {
public:
bool isAlienSorted(vector<string>& words, string order) {
vector<string>str;
int n = words.size();
map<char,int>trans;
for(int i=0;i<26;++i)
{
pair<char,int>t={order[i],i};
trans.insert(t);
}
for(int i=0;i<n-1;++i)
{
int j=0,k=0;
for(;j<words[i].length()&&k<words[i+1].length();++j,++k)
{
if(trans[words[i][j]]<trans[words[i+1][k]])
break;
else if(trans[words[i][j]]>trans[words[i+1][k]])
return false;
}
if(k==words[i+1].length())
return false;
}
return true;
}
};
最后看了一下最优解的代码,这道题map好像不如直接order.find()
auto我貌似也不经常用,明天可以看一下(话说最近要看C++了
class Solution {
public:
bool isAlienSorted(vector<string>& words, string order) {
vector<string>str;
int n = words.size();
for(int i=0;i<n-1;++i)
{
int j=0,k=0;
for(;j<words[i].length()&&k<words[i+1].length();++j,++k)
{
if(order.find(words[i][j])<order.find(words[i+1][k]))
break;
else if(order.find(words[i][j])>order.find(words[i+1][k]))
return false;
}
if(k==words[i+1].length())
return false;
}
return true;
}
};