To solve this problem, we need two steps:

1. Convert "order" string to a Hashmap, the key is the characor in the "order" string, value is its index.

2. Compare the words to check whether they are sorted correctly.

But how to compare multiple words? It's hard to compare multiple words, but it's very easy to compare two words, right? Then we can compare two words at a time.

The solution's Time complexity is O(m+n), m is the order's length, and n is words' length.

    Map<Character, Integer> map = new HashMap<>();

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

        for (int i = 0; i < order.length(); i++) {
            map.put(order.charAt(i), i);
        }
        for (int i = 1; i < words.length; i++) {
            if (!compare(words[i - 1], words[i], map))
                return false;
        }
        return true;
    }

    private boolean compare(String w1, String w2, Map<Character, Integer> map) {
        int m = w1.length(), n = w2.length();
        int i = 0, j = 0;
        while (i < m && j < n) {
            if (map.get(w1.charAt(i)) < map.get(w2.charAt(j))) {   //the most important step, if c1<c2, then return this method immediately, don't have to compare the following characters any more.
                return true;
            } else if (map.get(w1.charAt(i)) == map.get(w2.charAt(j))) {
                i++;
                j++;
            } else {
                return false;
            }
        }
        return m <= n;  //compare the length
    }

 

posted on 2022-01-28 04:54  阳光明媚的菲越  阅读(22)  评论(0编辑  收藏  举报