这是悦乐书的第364次更新,第392篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第226题(顺位题号是953)。在外语中,令人惊讶的是,他们也使用英文小写字母,但可能使用不同的顺序。字母表的顺序是小写字母的一些排列。

给定用外语编写的单词序列以及字母表的顺序,当且仅当给定单词在这种外来语言中按字典排序时才返回true。

例1:

输入:words = [“hello”,“leetcode”],order =“hlabcdefgijkmnopqrstuvwxyz”

输出:true

说明:由于'h'在此语言中位于'l'之前,因此序列已排序。

例2:

输入:words = [“word”,“world”,“row”],order =“worldabcefghijkmnpqstuvxyz”

输出:false

说明:由于'd'在此语言中位于'l'之后,然后是单词[0]>单词[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中的所有字符都是英文小写字母。

02 第一种解法

题目的意思是给定一个自定义的字母排列顺序,然后根据这个排列顺序来判断字符串数组中的字符串是不是顺序排列的,是就返回true,不是就返回false

正常的字母排列顺序肯定是abcde......xyz这样,但是题目给的不一定是这样,所以需要先将字母顺序建立起来,使用一个HashMap来存,记为dictkey为字母,value为字母所在的位置(在字符串order中的位置),接着开始处理words中的字符串。

我们依次比较相邻的两个字符串即可,对于前后两字符串的长度关系,有两种情况,两者长度相等或者一长一短,取两字符串长度中的较小值作为循环次数的上限,避免越界风险,并且后续还会用到这个较小的字符串长度。

获取两字符串当前字符在dict中的value值,并且做减法,如果两字符所在的位置之差为0,说明字符相,继续往下循环,指导不等于0。

如果两字符所在的位置之差为-1,说明顺序是对的,继续处理下一批相邻的字符串即可。

如果两字符所在的位置之差大于0,即前一个字符串中的当前字符在后一个字符串中的当前字符之后,即后一个字符串应该在前,返回false

如果两字符所在的位置之差等于0,即其中有个字符串短些,但是两字符串长度的较小值不等于前一个字符串的长度,即短的字符串在后,返回false,可以参见题目给的例子三。

public boolean isAlienSorted(String[] words, String order) {
Map<Character, Integer> dict = new HashMap<Character, Integer>();
for (int i=0; i<order.length(); i++) {
dict.put(order.charAt(i), i);
}
int n = words.length;
for (int i=0; i<n-1; i++) {
int res = 0;
String s = words[i], s2 = words[i+1];
int j = s.length(), k = s2.length();
int min = Math.min(j, k);
// 只有两边的字母相同,循环才会继续执行
for (int m=0; m < min && res == 0; m++) {
res = dict.get(s.charAt(m))-dict.get(s2.charAt(m));
}
if (res > 0 || (res == 0 && min != j)) {
return false;
}
}
return true;
}

03 第二种解法

针对上面的解法,我们可以将HashMap换成26的整型数组,将比较单个字母前后位置的方法独立了出来,其他思路都是一样的。

public boolean isAlienSorted2(String[] words, String order) {
int[] dict = new int[26];
for (int i=0; i<order.length(); i++) {
dict[order.charAt(i)-'a'] = i;
}
int n = words.length;
for (int i=0; i<n-1; i++) {
if (!compareTwoString(words[i], words[i+1], dict)) {
return false;
}
}
return true;
} public boolean compareTwoString(String s, String s2, int[] dict){
int i = s.length(), j = s2.length();
int min = Math.min(i, j);
int res = 0;
for (int k=0; k<min && res == 0; k++) {
res = dict[s.charAt(k)-'a'] - dict[s2.charAt(k)-'a'];
}
if (res > 0) {
return false;
}
return res == 0 ? min==i : true;
}

04 小结

算法专题目前已连续日更超过七个月,算法题文章232+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.953-验证外语字典顺序(Verifying an Alien Dictionary)的更多相关文章

  1. 【Leetcode_easy】953. Verifying an Alien Dictionary

    problem 953. Verifying an Alien Dictionary solution: class Solution { public: bool isAlienSorted(vec ...

  2. Verifying an Alien Dictionary

    2019-11-24 22:11:30 953. Verifying an Alien Dictionary 问题描述: 问题求解: 这种问题有一种解法是建立新的排序和abc排序的映射,将这里的str ...

  3. LeetCode 953. Verifying an Alien Dictionary (验证外星语词典)

    题目标签:HashMap 题目给了我们一个 order 和 words array,让我们依照order 来判断 words array 是否排序. 利用hashmap 把order 存入 map, ...

  4. LeetCode 953. Verifying an Alien Dictionary

    原题链接在这里:https://leetcode.com/problems/verifying-an-alien-dictionary/ 题目: In an alien language, surpr ...

  5. 【leetcode】953. Verifying an Alien Dictionary

    题目如下: In an alien language, surprisingly they also use english lowercase letters, but possibly in a ...

  6. 【LeetCode】953. Verifying an Alien Dictionary 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. LeetCode 953 Verifying an Alien Dictionary 解题报告

    题目要求 In an alien language, surprisingly they also use english lowercase letters, but possibly in a d ...

  8. 953.Verifying an Alien Dictionary(Map)

    In an alien language, surprisingly they also use english lowercase letters, but possibly in a differ ...

  9. [Swift]LeetCode953. 验证外星语词典 | Verifying an Alien Dictionary

    In an alien language, surprisingly they also use english lowercase letters, but possibly in a differ ...

随机推荐

  1. 免费自动化测试工具Katalon Studio入门

    Katalon Studio 一.简介: Katalon Studio 是一个在网页应用.移动和网页服务方面功能强大的自动化测试解决方案.基于 Selenium 和 Appium 框架,Katalon ...

  2. 【洛谷P4552】IncDec Sequence

    题目大意:给定一个长度为 N 的序列,现可以进行若干次区间 +1 或区间 -1 操作,求使得序列所有的值均相同的最小操作数是多少,且最终得到的序列有多少种. 题解: 首先考虑执行区间+和区间-操作,可 ...

  3. grunt-contrib-jshint js代码检查

    grunt-contrib-jshint:用于javascript代码检查(并会给出建议),发布js代码前执行jshint任务, 可以避免出现一些低级语法问题jshint拥有非常丰富的配置,可以自由控 ...

  4. 【leetcode】1239. Maximum Length of a Concatenated String with Unique Characters

    题目如下: Given an array of strings arr. String s is a concatenation of a sub-sequence of arr which have ...

  5. IE浏览器如何实现断点续传

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  6. 51 Nod 1627瞬间移动(插板法!)

    1627 瞬间移动  基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右 ...

  7. spark RDD 的基本操作

    好记性不如烂笔头,分享一下 Spark是一个计算框架,是对mapreduce计算框架的改进,mapreduce计算框架是基于键值对也就是map的形式,之所以使用键值对是人们发现世界上大部分计算都可以使 ...

  8. iOS检测QQ是否安装

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqq://"]]) {     ...

  9. 文件和Stream

    I/O和文件 输入/输出(I/O)就是在内存和外部设备之间复制数据的过程.输入(input)就是从I/O设备复制数据到内存,输出(output)就是从内存复制数据到I/O设备. 一个文件可以理解成一串 ...

  10. java链接Mysql出现警告:Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by

    Java使用mysql-jdbc连接MySQL出现如下警告: Establishing SSL connection without server's identity verification is ...