剑指 Offer II 034. 外星语言是否排序

100 篇文章 2 订阅

剑指 Offer II 034. 外星语言是否排序

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

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

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

来源:LeetCode

其实思路很简单,就是先将order这个字符串中的字母转换成数组,每个数组元素来存储相对应的字母的索引:
例如index【h】=1,index【l】=2;
这样就只需要数组长度是26就可以了。

接下来就是比较连续两个字符串之间是否满足对应关系:由两个for循环来实现。
cur表示当前数组元素的第j位,pre表示其前一个字符串的第j位,比较cur和pre的大小:
cur>pre:说明当前字母符合顺序规范,还需要比较后面的,先给让flag为true,然后break。
cur>pre:直接返回false就好。

对于一些cur==pre的情况:如果第i个字符串的长度小于第i-1个字符串的长度:
比如“apple”,“app”,这种情况就是false,直接返回false即可,但是前提是得等前几个字母比较完成,所以这个判断应该放在第二个的for循环之外。

还有最后就是类似“app”,“apple”这种情况,一定会返回true,只要最后默认返回true即可。

class Solution {
    public boolean isAlienSorted(String[] words, String order) {
        boolean flag=false;
        int[] index = new int[26];
        //将order转换为index数组
        for(int i=0;i<order.length();i++){
            index[order.charAt(i)-'a']=i;
        }
        //比较两个字符串之间的排序关系
        int len = words.length;
        for(int i=1;i<len;i++){

            for(int j=0;j<words[i].length()&&j<words[i-1].length();j++){

            int cur = index[words[i].charAt(j)-'a'];
            int pre = index[words[i-1].charAt(j)-'a'];
            if(cur>pre){
                flag= true;
                break;
                }
            if(cur<pre){
                return false;
                } 
            }
            if(!flag&&words[i].length()<words[i-1].length())
            {
                return false;
            }
        }

        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值