All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0901_1000.s0953_verifying_an_alien_dictionary.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0901_1000.s0953_verifying_an_alien_dictionary;

// #Easy #Array #String #Hash_Table #Programming_Skills_I_Day_9_String
// #2022_12_26_Time_0_ms_(100.00%)_Space_40.7_MB_(94.41%)

/**
 * 953 - Verifying an Alien Dictionary\.
 *
 * Easy
 *
 * In an alien language, surprisingly, they also use English lowercase letters, but possibly in a different `order`. The `order` of the alphabet is some permutation of lowercase letters.
 *
 * Given a sequence of `words` written in the alien language, and the `order` of the alphabet, return `true` if and only if the given `words` are sorted lexicographically in this alien language.
 *
 * **Example 1:**
 *
 * **Input:** words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz"
 *
 * **Output:** true
 *
 * **Explanation:** As 'h' comes before 'l' in this language, then the sequence is sorted.
 *
 * **Example 2:**
 *
 * **Input:** words = ["word","world","row"], order = "worldabcefghijkmnpqstuvxyz"
 *
 * **Output:** false
 *
 * **Explanation:** As 'd' comes after 'l' in this language, then words[0] > words[1], hence the sequence is unsorted.
 *
 * **Example 3:**
 *
 * **Input:** words = ["apple","app"], order = "abcdefghijklmnopqrstuvwxyz"
 *
 * **Output:** false
 *
 * **Explanation:** The first three characters "app" match, and the second string is shorter (in size.) According to lexicographical rules "apple" > "app", because 'l' > '∅', where '∅' is defined as the blank character which is less than any other character ([More info](https://en.wikipedia.org/wiki/Lexicographical_order)).
 *
 * **Constraints:**
 *
 * *   `1 <= words.length <= 100`
 * *   `1 <= words[i].length <= 20`
 * *   `order.length == 26`
 * *   All characters in `words[i]` and `order` are English lowercase letters.
**/
public class Solution {
    public boolean isAlienSorted(String[] words, String order) {
        int[] map = new int[26];
        for (int i = 0; i < order.length(); i++) {
            map[order.charAt(i) - 'a'] = i;
        }
        for (int i = 0; i < words.length - 1; i++) {
            if (!isSmaller(words[i], words[i + 1], map)) {
                return false;
            }
        }
        return true;
    }

    private boolean isSmaller(String str1, String str2, int[] map) {
        int len1 = str1.length();
        int len2 = str2.length();
        int minLength = Math.min(len1, len2);
        for (int i = 0; i < minLength; i++) {
            if (map[str1.charAt(i) - 'a'] > map[str2.charAt(i) - 'a']) {
                return false;
            } else if (map[str1.charAt(i) - 'a'] < map[str2.charAt(i) - 'a']) {
                return true;
            }
        }
        return len1 <= len2;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy