Redian新闻
>
LeetCode 力扣官方题解 | 953. 验证外星语词典

LeetCode 力扣官方题解 | 953. 验证外星语词典

公众号新闻

953. 验证外星语词典


题目描述

难易度:简单

某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。

给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。

 示例 1:

输入:words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz"输出:true解释:在该语言的字母表中,'h' 位于 'l' 之前,所以单词序列是按字典序排列的。

示例 2:

输入:words = ["word","world","row"], order = "worldabcefghijkmnpqstuvxyz"输出:false解释:在该语言的字母表中,'d' 位于 'l' 之后,那么 words[0] > words[1],因此单词序列不是按字典序排列的。
示例 3:
输入:words = ["apple","app"], order = "abcdefghijklmnopqrstuvwxyz"输出:false解释:当前三个字符 "app" 匹配时,第二个字符串相对短一些,然后根据词典编纂规则 "apple" > "app",因为 'l' > '∅',其中 '∅' 是空白字符,定义为比任何其他字符都小(更多信息)。

提示:
  • 1 <= words.length <= 100

  • 1 <= words[i].length <= 20

  • order.length == 26

  • 在 words[i] 和 order 中的所有字符都是英文小写字母。


解决方案

方法一:直接遍历

思路和算法

题目要求按照给定的字母表 order 的顺序,检测给定的字符串数组是否按照 order 的字典升序排列,我们只需要依次检测 strs 中的字符串前一个字符串和后一个字符串在给定的字母表下的字典序即可。具体检测如下:

  • 首先将给定的 order 转化为字典序索引 index,index[i] 表示字符 i 在字母表 order 的排序索引,index[i] > index[j] 即表示字符 i 在字母表中的字典序比字符 j 的字典序大,index[i] < index[j] 即表示字符 i 在字母表中的字典序比字符 j 的字典序小。

  • 依次检测第 i 个单词 strs[i] 与第 i−1 个单词 strs[i−1] 的字典序大小,我们可以依次判断两个单词中从左到右每个字符的字典序大小,当第一次出现两个字符的字典序不同时,即可判断两个字符串的字典序的大小。

  • 特殊情况需要处理,设 strs[i] 的长度为 m,strs[i] 的长度小于 strs[i−1] 的长度且 strs[i] 的前 m 个字符与 strs[i−1] 的前 m 个字符相等,此时 strs[i−1] 的字典序大于 strs[i] 的字典序。


代码
Python3
class Solution:    def isAlienSorted(self, words: List[str], order: str) -> bool:        index = {c: i for i, c in enumerate(order)}        return all(s <= t for s, t in pairwise([index[c] for c in word] for word in words))

Java
class Solution {    public boolean isAlienSorted(String[] words, String order) {        int[] index = new int[26];        for (int i = 0; i < order.length(); ++i) {            index[order.charAt(i) - 'a'] = i;        }        for (int i = 1; i < words.length; i++) {            boolean valid = false;            for (int j = 0; j < words[i - 1].length() && j < words[i].length(); j++) {                int prev = index[words[i - 1].charAt(j) - 'a'];                int curr = index[words[i].charAt(j) - 'a'];                if (prev < curr) {                    valid = true;                    break;                } else if (prev > curr) {                    return false;                }            }            if (!valid) {                /* 比较两个字符串的长度 */                if (words[i - 1].length() > words[i].length()) {                    return false;                }            }        }        return true;    }}

C++
class Solution {public:    bool isAlienSorted(vector<string>& words, string order) {        vector<int> index(26);        for (int i = 0; i < order.size(); i++) {            index[order[i] - 'a'] = i;        }        for (int i = 1; i < words.size(); i++) {            bool valid = false;            for (int j = 0; j < words[i - 1].size() && j < words[i].size(); j++) {                int prev = index[words[i - 1][j] - 'a'];                int curr = index[words[i][j] - 'a'];                if (prev < curr) {                    valid = true;                    break;                } else if (prev > curr) {                    return false;                }            }            if (!valid) {                /* 比较两个字符串的长度 */                if (words[i - 1].size() > words[i].size()) {                    return false;                }            }        }        return true;    }};

C#
public class Solution {    public bool IsAlienSorted(string[] words, string order) {        int[] index = new int[26];        for (int i = 0; i < order.Length; ++i) {            index[order[i] - 'a'] = i;        }        for (int i = 1; i < words.Length; i++) {            bool valid = false;            for (int j = 0; j < words[i - 1].Length && j < words[i].Length; j++) {                int prev = index[words[i - 1][j] - 'a'];                int curr = index[words[i][j] - 'a'];                if (prev < curr) {                    valid = true;                    break;                } else if (prev > curr) {                    return false;                }            }            if (!valid) {                /* 比较两个字符串的长度 */                if (words[i - 1].Length > words[i].Length) {                    return false;                }            }        }        return true;    }}

C
bool isAlienSorted(char ** words, int wordsSize, char * order){    int index[26];    int len = strlen(order);    for (int i = 0; i < len; i++) {        index[order[i] - 'a'] = i;    }    for (int i = 1; i < wordsSize; i++) {        bool valid = false;        int l1 = strlen(words[i - 1]);        int l2 = strlen(words[i]);        int n = l1 < l2 ? l1 : l2;        for (int j = 0; j < n; j++) {            int prev = index[words[i - 1][j] - 'a'];            int curr = index[words[i][j] - 'a'];            if (prev < curr) {                valid = true;                break;            } else if (prev > curr) {                return false;            }        }        if (!valid) {            /* 比较两个字符串的长度 */            if (l1 > l2) {                return false;            }        }    }    return true;}

JavaScript
var isAlienSorted = function(words, order) {    const index = new Array(26).fill(0);    for (let i = 0; i < order.length; ++i) {        index[order[i].charCodeAt() - 'a'.charCodeAt()] = i;    }    for (let i = 1; i < words.length; i++) {        let valid = false;        for (let j = 0; j < words[i - 1].length && j < words[i].length; j++) {            let prev = index[words[i - 1][j].charCodeAt() - 'a'.charCodeAt()];            let curr = index[words[i][j].charCodeAt() - 'a'.charCodeAt()];            if (prev < curr) {                valid = true;                break;            } else if (prev > curr) {                return false;            }        }        if (!valid) {            /* 比较两个字符串的长度 */            if (words[i - 1].length > words[i].length) {                return false;            }        }    }    return true;};

Golang
func isAlienSorted(words []string, order string) bool {    index := [26]int{}    for i, c := range order {        index[c-'a'] = i    }next:    for i := 1; i < len(words); i++ {        for j := 0; j < len(words[i-1]) && j < len(words[i]); j++ {            pre, cur := index[words[i-1][j]-'a'], index[words[i][j]-'a']            if pre > cur {                return false            }            if pre < cur {                continue next            }        }        if len(words[i-1]) > len(words[i]) {            return false        }    }    return true}

复杂度分析
  • 时间复杂度:O(m×n),其中 m 为字符串数组的长度,n 为数组中字符串的平均长度,每个字符串需要前一个字符串进行比较,因此时间复杂度为 O(m×n)。

  • 空间复杂度:O(C)。其中 C 表示字母表的长度,需要存储字母表 order 每个字符的字典序索引,题目中给定的字母表的长度为 C = 26。



BY / 

本文作者:力扣

编辑&版式:Vikki
声明:本文归“力扣”版权所有,如需转载请联系。

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
金碧辉煌的凡尔赛镜子厅首次免费送!Leetcode刷题速通指南,转码留学生请低调使用!恭喜LI同学无悬念拿下EA职业认证外加国内工作的年限评定!红枣核桃酥(Walnut Date Biscuit Cookies)LeetCode 力扣官方题解 | 2055. 蜡烛之间的盘子LeetCode 力扣官方题解 | 806. 写字符串需要的行数LeetCode 力扣官方题解 | 590. N 叉树的后序遍历厚德E行丨星语星愿 情系特殊天使:清华经管EMBA广西校友会关爱特殊儿童【首发新活动】波屯星座交友第一期:星语心愿IEEE标准协会网络研讨会 | PRODUCT SHOWCASE: IEEE EQ NAVIGATOR去乌节路感受圣诞气氛偶遇小陈注意!眼下比有刷LeetCode更重要的事…刷完 LeetCode 是什么水平?能拿到什么等级的Offer?LeetCode 力扣官方题解 | 521. 最长特殊序列 Ⅰ心心念念文学城深度好文|刷完 LeetCode 是什么水平?能拿到什么等级的Offer?Wordbook:适用于 GNOME 的离线英语词典应用 | Linux 中国靠LeetCode刷题模板,学妹“开奖”字节offer!LeetCode 力扣官方题解 | 2104. 子数组范围和IEEE Education Week主题演讲 | 主讲人:IEEE主席Saifur Rahman《LCTT 术语词典》 | Linux 中国健身的圣诞老人向运动健身坛的朋友祝圣诞快乐打卡LeetCode的第100天,我才发现......老鸟也难逃一劫,Leetcode刷题家今年是真的惨!历史上的今天 |《牛津英语词典》第一版第一册出版一日一诗:星语与星愿 / 在一闪的光亮里相遇 | 晴空:流星雨2023开年16天上岸谷歌,Leetcode刷题小抄背完,面试真的不一样…Layoff潮,对传统刷LeetCode发起新挑战!注意!眼下比刷LeetCode更重要的事LeetCode 力扣官方题解 | 2049. 统计最高分的节点数目深度好文|打卡LeetCode的第100天,我才发现......拿下6家offer经验分享:刷LeetCode这件事,其实不靠努力!背完LeetCode刷题模板,真的不一样!(已拿字节offer)0基础留学生转码必备:LeetCode到底该怎么速通?留学圈疯传!商科生转码《Leetcode刷题指南》,信息量太大
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。