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:
-
trueif the words are sorted lexicographically according to the alien language -
falseotherwise
π§ 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! π
λ΅κΈ λ¨κΈ°κΈ°