DEV Community

swati goyal
swati goyal

Posted on

# 👽 Verifying an Alien Dictionary (LeetCode 953)

Imagine you're interviewing on another planet. 🌎➡️🛸

The aliens use the same English lowercase letters (a-z), but their alphabet order is completely different!

Your task is to determine whether a list of words is sorted according to the alien alphabet.


📌 Problem Statement

Given:

  • An array of words
  • A string representing the alien alphabet order

Return:

  • true if the words are sorted lexicographically according to the alien language
  • false otherwise

🧠 Example 1

words = ["hello","leetcode"]
order = "hlabcdefgijkmnopqrstuvwxyz"
Enter fullscreen mode Exit fullscreen mode

Output:

true
Enter fullscreen mode Exit fullscreen mode

Why?

The first differing characters are:

hello
leetcode
↑
h comes before l
Enter fullscreen mode Exit fullscreen mode

Since h < l in the alien language, the words are correctly ordered.


🧠 Example 2

words = ["word","world","row"]
order = "worldabcefghijkmnpqstuvxyz"
Enter fullscreen mode Exit fullscreen mode

Output:

false
Enter fullscreen mode Exit fullscreen mode

Comparison:

word
world
Enter fullscreen mode Exit fullscreen mode

First differing characters:

word
worl(d)
    ↑

world
worl(l)
    ↑
Enter fullscreen mode Exit fullscreen mode

In the alien dictionary, d appears after l, making:

word > world
Enter fullscreen mode Exit fullscreen mode

which violates the sorted order.


🧠 Example 3

words = ["apple","app"]
order = "abcdefghijklmnopqrstuvwxyz"
Enter fullscreen mode Exit fullscreen mode

Output:

false
Enter fullscreen mode Exit fullscreen mode

Both words share the prefix:

app
Enter fullscreen mode Exit fullscreen mode

But:

apple
app
Enter fullscreen mode Exit fullscreen mode

The shorter word should come first.

Just like:

app < apple
Enter fullscreen mode Exit fullscreen mode

Therefore:

apple > app
Enter fullscreen mode Exit fullscreen mode

and the list is not sorted.


🔍 Key Observation

Comparing words in an alien language is exactly like comparing words in English.

The only difference is:

Character ranking is different.
Enter fullscreen mode Exit fullscreen mode

So instead of comparing characters directly:

'a' < 'b'
Enter fullscreen mode Exit fullscreen mode

we compare their positions in the alien alphabet.


🚀 Step 1: Build Character Ranking

Given:

order = "hlabcdefgijkmnopqrstuvwxyz"
Enter fullscreen mode Exit fullscreen mode

Create a mapping:

h → 0
l → 1
a → 2
b → 3
...
Enter fullscreen mode Exit fullscreen mode

This allows us to instantly know which character comes first.


🚀 Step 2: Compare Adjacent Words

If the entire list is sorted, then every adjacent pair must also be sorted.

So compare:

words[0] vs words[1]
words[1] vs words[2]
words[2] vs words[3]
...
Enter fullscreen mode Exit fullscreen mode

If any comparison fails, return false.


🚀 Step 3: Compare Two Words

Consider:

hello
leetcode
Enter fullscreen mode Exit fullscreen mode

Compare character by character:

h vs l
Enter fullscreen mode Exit fullscreen mode

As soon as characters differ:

  • If first character comes before second → valid
  • Otherwise → invalid

No need to check the remaining characters.


⚠️ Special Case: Prefix Problem

Consider:

apple
app
Enter fullscreen mode Exit fullscreen mode

All common characters match:

app
app
Enter fullscreen mode Exit fullscreen mode

Now one word ends.

Lexicographical rule:

Shorter word comes first.
Enter fullscreen mode Exit fullscreen mode

Therefore:

app < apple
Enter fullscreen mode Exit fullscreen mode

If the first word is longer:

apple > app
Enter fullscreen mode Exit fullscreen mode

Return false.


✅ Java Solution

class Solution {
    public boolean isAlienSorted(String[] words, String order) {
        int n = words.length;

        int[] charToIdxMap = new int[26];
        for(int i = 0; i < 26; i++) {
            charToIdxMap[order.charAt(i) - 'a'] = i;
        }

        for(int i = 1; i < n; i++) {
            if(!isValid(words[i - 1], words[i], charToIdxMap)) {
                return false;
            }
        }

        return true;
    }

    public boolean isValid(String word0, String word1, int[] charToIdxMap) {
        int n0 = word0.length();
        int n1 = word1.length();
        int len = Math.min(n0, n1);

        for(int i = 0; i < len; i++) {
            char ch1 = word0.charAt(i);
            char ch2 = word1.charAt(i);

            if(ch1 != ch2) {
                return charToIdxMap[ch1 - 'a'] < charToIdxMap[ch2 - 'a'];
            }
        }

        return n0 <= n1;
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 Dry Run

Input:

words = ["hello","leetcode"]
order = "hlabcdefgijkmnopqrstuvwxyz"
Enter fullscreen mode Exit fullscreen mode

Build Mapping

h → 0
l → 1
a → 2
...
Enter fullscreen mode Exit fullscreen mode

Compare

hello
leetcode
Enter fullscreen mode Exit fullscreen mode

First characters:

h vs l
Enter fullscreen mode Exit fullscreen mode

Mapped positions:

h → 0
l → 1
Enter fullscreen mode Exit fullscreen mode

Since:

0 < 1
Enter fullscreen mode Exit fullscreen mode

the pair is valid.

No more pairs remain.

Return:

true
Enter fullscreen mode Exit fullscreen mode

⏱️ Time Complexity

Let:

  • N = number of words
  • L = average word length

Building the map:

O(26)
Enter fullscreen mode Exit fullscreen mode

Comparing adjacent words:

O(N × L)
Enter fullscreen mode Exit fullscreen mode

Overall:

Time Complexity = O(N × L)
Enter fullscreen mode Exit fullscreen mode

💾 Space Complexity

We store the character ranking map:

int[26]
Enter fullscreen mode Exit fullscreen mode

Therefore:

Space Complexity = O(1)
Enter fullscreen mode Exit fullscreen mode

because the alphabet size is fixed.


🔥 Interview Takeaways

This problem tests:

  • Custom sorting logic
  • Lexicographical comparison
  • String processing
  • Edge cases involving prefixes
  • Efficient use of character mappings

The most important insight is:

Don't compare characters directly. Compare their positions in the alien alphabet.

Once you build the ranking map, the rest becomes a straightforward lexicographical comparison problem.


💬 What do you think?

Have you seen a variation of this problem where the alien alphabet order was not given directly but had to be derived from the words themselves? That's an interesting follow-up often asked in interviews. Let me know how you would approach it! 👇

Top comments (0)