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

每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

阅读理解

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

思路一:模拟

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

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=0n1words[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=0n1words[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,要赶紧调整心态哦】


欢迎指正与讨论!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:这段代码是一个解决LeetCode上某个题目的C++实现,具体是一个双指针的解法。该题目是计算一个数组中的积水量。代码中使用了两个指针分别指向数组的左右边界,然后通过比较左右指针所指向的元素的大小,来确定当前位置的积水量。具体的计算方法是,如果左指针所指向的元素小于右指针所指向的元素,则对左指针的左边进行操作,如果左指针所指向的元素大于等于右指针所指向的元素,则对右指针的右边进行操作。在每一次操作中,都会更左边的最大值和右边的最大值,并计算当前位置的积水量。最后返回总的积水量。\[1\] 引用\[2\]:这段代码是另一个解决LeetCode上某个题目的C++实现,具体是一个深度优先搜索的解法。该题目是计算一个二维网格中从起点到终点的可行路径数量。代码中使用了递归的方式进行深度优先搜索,从起点开始,每次向下或向右移动一步,直到到达终点。在每一步移动中,会判断当前位置是否有障碍物,如果有障碍物则返回0,如果到达终点则返回1,否则继续递归搜索下一步的位置。最后返回总的可行路径数量。\[2\] 引用\[3\]:这段代码是另一个解决LeetCode上某个题目的C++实现,具体是一个动态规划的解法。该题目是计算一个数组中的积水量。代码中使用了动态规划的思想,通过遍历数组中的每个元素,分别计算该元素左边和右边的最大值,并计算当前位置的积水量。最后返回总的积水量。\[3\] 综上所述,这三段代码分别是解决LeetCode上不同题目的C++实现,分别使用了双指针、深度优先搜索和动态规划的方法来解决问题。 #### 引用[.reference_title] - *1* *3* [Leetcode 热题100 42.接雨水(C++ 多种解法,错过可惜)](https://blog.csdn.net/qq_51933234/article/details/124637883)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [[C++]Leetcode 不同路径 || 解题思路及详解](https://blog.csdn.net/weixin_62712365/article/details/123951736)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值