思路:
- 题目的本质还是对字符串进行排序,首先可以回忆一下如何正常的按照字典序给两个字符串(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
}