1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public boolean isAlienSorted(String[] words, String order) { Map<Character, Integer> orderMap = new HashMap<>(); for (int i = 0; i < order.length(); i++) { orderMap.put(order.charAt(i), i); } for (int i = 1; i < words.length; i++) { if (compare(words[i - 1], words[i], orderMap) > 0) return false; } return true; }
private int compare(String str1, String str2, Map<Character, Integer> orderMap) { if (str1.equals(str2)) return 0; int ptr1 = 0, ptr2 = 0; while (ptr1 < str1.length() && ptr2 < str2.length()) { int letterOneOrder = orderMap.get(str1.charAt(ptr1)), letterTwoOrder = orderMap.get(str2.charAt(ptr2)); if (letterOneOrder < letterTwoOrder) { return -1; } else if (letterOneOrder > letterTwoOrder) { return 1; } else { ptr1 += 1; ptr2 += 1; } } return ptr1 == str1.length() ? -1 : 1; } }
|
我们要思考两个string是如何比较大小的. 是一个一个char进行比较的. 直到某个位置发现一个char大一个char小. 那么就会有下面的情况: 在其中一个string用完之前分出大小: 在某个位置, 一个string的char比另一个string该位置的char小. 在其中一个string用完后也没分出大小, 也就是短的string是长的string的substring. 此时看长的string的长度. 如果长的string刚刚好也用完(此时叫长的string不是很合适了), 那么这两个string就是相等的, 否则短的string小,
长的string大.
因此按照这个逻辑一个一个char比较即可.
时间复杂度: O(ns) 因为我们要遍历每一个word的每一个char
空间复杂度: O(1) 用来记录order的map