每日一题做题记录,参考官方和三叶的题解 |
题目要求
阅读理解
【明明是简单题结果读了好久没懂题目……】
判断给出的单词是不是按照字典序依次排列,而不是判断单词本身内部……解释起来好智障,咋就给自己绕进去半天……
思路一:模拟
- 先用数字形式存下来字典;
- 然后逐个单词逐位比较是否按字典序排列就好。
Java
class Solution {
int[] dic = new int[26];
int check(String a, String b) {
int n = a.length(), m = b.length();
int i = 0, j = 0;
while(i < n && j < m) {
int ca = a.charAt(i) - 'a', cb = b.charAt(i) - 'a';
if(ca != cb)
return dic[ca] - dic[cb];
i++;
j++;
}
if(i < n) // a比较长
return 1;
if(j < m) // b比较长
return -1;
return 0;
}
public boolean isAlienSorted(String[] words, String order) {
for(int i = 0; i < 26; i++)
this.dic[order.charAt(i) - 'a'] = i;
int n = words.length;
for(int i = 1; i < n; i++)
if(check(words[i - 1], words[i]) > 0) // 即前大于后
return false;
return true;
}
}
- 时间复杂度: O ( ∑ i = 0 n − 1 w o r d s [ i ] ) O(\sum^{n-1}_{i=0}words[i]) O(∑i=0n−1words[i])
- 空间复杂度: O ( C ) O(C) O(C)
C++
class Solution {
int dic[26];
public:
int check(string a, string b) {
int n = a.size(), m = b.size();
int i = 0, j = 0;
while(i < n && j < m) {
int ca = a[i] - 'a', cb = b[j] - 'a';
if(ca != cb)
return dic[ca] - dic[cb];
i++;
j++;
}
if(i < n) // a比较长
return 1;
if(j < m) // b比较长
return -1;
return 0;
}
bool isAlienSorted(vector<string>& words, string order) {
for(int i = 0; i < 26; i++)
dic[order[i] - 'a'] = i;
int n = words.size();
for(int i = 1; i < n; i++)
if(check(words[i - 1], words[i]) > 0) // 即前大于后
return false;
return true;
}
};
- 时间复杂度: O ( ∑ i = 0 n − 1 w o r d s [ i ] ) O(\sum^{n-1}_{i=0}words[i]) O(∑i=0n−1words[i])
- 空间复杂度: O ( C ) O(C) O(C)
思路二:自定义排序
- 重写排序函数,然后对给出的单词进行排序;
- 排序结果和给出的对比是否一样。
- 其实核心思路和上面一样,拉出来单独比较。
Java
class Solution {
public boolean isAlienSorted(String[] words, String order) {
int[] dic = new int[26];
for(int i = 0; i < 26; i++)
dic[order.charAt(i) - 'a'] = i;
String[] alienSort = words.clone();
Arrays.sort(alienSort, (a, b) -> {
int n = a.length(), m = b.length();
int i = 0, j = 0;
while(i < n && j < m) {
int ca = a.charAt(i) - 'a', cb = b.charAt(j) - 'a';
if(ca != cb)
return dic[ca] - dic[cb];
i++;
j++;
}
if(i < n) // a比较长
return 1;
if(j < m) // b比较长
return -1;
return 0;
});
int n = words.length;
for(int i = 0; i < n; i++)
if(!alienSort[i].equals(words[i]))
return false;
return true;
}
}
- 时间复杂度: O ( n log n ) O(n\log n) O(nlogn)
- 空间复杂度: O ( log n ) O(\log n) O(logn)
C++
【sort
函数调用的this调了好久,感觉要好好看看sort里重写函数的方法】
class Solution {
public:
int dic[26];
bool isAlienSorted(vector<string>& words, string order) {
for(int i = 0; i < 26; i++)
dic[order[i] - 'a'] = i;
vector<string> alienSort = words;
sort(alienSort.begin(), alienSort.end(), [this](const string &a, const string &b) {
int n = a.size(), m = b.size();
int i = 0, j = 0;
while(i < n && j < m) {
int ca = a[i] - 'a', cb = b[j] - 'a';
if(ca != cb)
return dic[ca] - dic[cb] <= 0;
i++;
j++;
}
return a.size() <= b.size(); // b长正确,a长就反了,
});
int n = words.size();
for(int i = 0; i < n; i++)
if(alienSort[i] != words[i])
return false;
return true;
}
};
- 时间复杂度: O ( n log n ) O(n\log n) O(nlogn)
- 空间复杂度: O ( log n ) O(\log n) O(logn)
总结
读懂题目用了半天……以为他说单个单词内部满足字典序……
读懂题之后感觉还是名副其实简单题的,逐位比较就好了,就是需要注意记录字典的方式。
【这几天好down哦,越忙碌越down,要赶紧调整心态哦】
欢迎指正与讨论! |