剑指offer 专项突破版 34、外星语言是否排序

题目链接

思路:

  • 题目的本质还是对字符串进行排序,首先可以回忆一下如何正常的按照字典序给两个字符串(s,t)排序
    • 逐个字符对比,如果此时ch1 > ch2,那就说明t在前,如果此时ch1 < ch2,那就说明s在前,如果ch1 = ch2,那就继续比对。
    • 如果直到一方结束后仍未出结果,那么就让短的排在前面
  • 那么这个题目和我们之前字符串比对的区别就是,字符的优先级不同。此前我们判断ch1 > ch2的依据就是编码的大小,所以我们可以把a–z的优先级看作0-25,那么此时有了新的字母表顺序,所以我们可以用一个数组来存储不同字母的优先级,原先判断可以直接通过ch1和ch2的数值进行比较,现在我们需要通过orderArray[ch1-‘a’] 和 orderArray[ch2-‘a’]来进行比较。
class Solution {

    int[] orderArray = new int[26];

    //如果s1应该排在s2前面 返回true
    boolean isOrdered(String s1, String s2) {

        for (int i = 0; i < Math.min(s1.length(), s2.length()); i++) {
            char ch1 = s1.charAt(i), ch2 = s2.charAt(i);

            if (orderArray[ch1 - 'a'] < orderArray[ch2 - 'a'])
                return true;
            else if(orderArray[ch1 - 'a'] > orderArray[ch2 - 'a'])
                return false;
        }
        return s1.length() <= s2.length();
    }

    public boolean isAlienSorted(String[] words, String order) {

        //根据order确定每个字符的优先级(优先级越低 排序越靠前)
        for (int i = 0; i < order.length(); i++) {
            orderArray[order.charAt(i) - 'a'] = i;
        }

        for (int i = 0; i < words.length - 1; i++) {
            if(!isOrdered(words[i],words[i+1]))
                return false;
        }
        return true;
    }
}
Go代码
func isAlienSorted(words []string, order string) bool {
	// 更新优先级
	priority := [26]int{}
	for index, ch := range order {
		priority[ch-'a'] = 26 - index
	}

	for i := 0; i < len(words)-1; i++ {
		word1, word2 := words[i], words[i+1]
		rangeLen := min(len(word1), len(word2))
		var j int
		for ; j < rangeLen; j++ {
			ch1, ch2 := word1[j], word2[j]
			if priority[ch1-'a'] < priority[ch2-'a'] {
				return false
			} else if priority[ch1-'a'] == priority[ch2-'a'] {
				continue
			} else {
				break
			}
		}
		if len(word1) > len(word2) && len(word2) == j {
			return false
		}
	}
	return true
}

func min(m, n int) int {
	if m < n {
		return m
	}
	return n
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值