Java&C++题解与拓展——leetcode953.验证外星语【么的新知识】

163 阅读1分钟
每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

阅读理解

【明明是简单题结果读了好久没懂题目……】
判断给出的单词是不是按照字典序依次排列,而不是判断单词本身内部……解释起来好智障,咋就给自己绕进去半天……

思路一:模拟

  • 先用数字形式存下来字典;
  • 然后逐个单词逐位比较是否按字典序排列就好。

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=0n1words[i])O(\sum^{n-1}_{i=0}words[i])
  • 空间复杂度: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=0n1words[i])O(\sum^{n-1}_{i=0}words[i])
  • 空间复杂度: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(nlogn)O(n\log n)
  • 空间复杂度:O(logn)O(\log n)

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(nlogn)O(n\log n)
  • 空间复杂度:O(logn)O(\log n)

总结

读懂题目用了半天……以为他说单个单词内部满足字典序……

读懂题之后感觉还是名副其实简单题的,逐位比较就好了,就是需要注意记录字典的方式。

【这几天好down哦,越忙碌越down,要赶紧调整心态哦】


欢迎指正与讨论!