《剑指 Offer》专项突破版 - 面试题 34 : 外星语言是否排序(C++ 实现)

题目链接LCR 034. 验证外星语词典 - 力扣(LeetCode)

题目

有一门外星语言,它的字母表刚好包含所有的英文小写字母,只是字母表的顺序不同。给定一组单词和字母表顺序,请判断这些单词是否按照字母表的顺序排序。例如,输入一组单词 ["offer", "is", "coming"],以及字母表顺序 "zyxwvutsrqponmlkjihgfedcba",由于字母 'o' 在字母表中位于 'i' 的前面,因此单词 "offer" 排在 "is" 前面;同样,由于字母 'i' 在字母表中位于 'c' 的前面,因此单词 "is" 排在 "coming" 的前面。因此,这组单词是按照字母表顺序排序的,应该输出 true。

分析

首先分析如何按照常规字母表的顺序确定英文单词的顺序。例如,两个单词 "offer" 和 "often",它们前面的两个字母都是相同的,分别是 'o' 和 'f'。它们的第三个字母,一个是 'f',另一个是 't'。在常规字母表中,字母 'f' 的位置在 't' 的前面(即 'f' < 't'),因此,单词 "offer" 应该排在 "often" 的前面。

但目前字母表的顺序由一个输入的字符串决定。在确定单词排序的顺序时,它们的每个字母在该字母表中的顺序至关重要。为了方便查找每个字母在字母表中的顺序,可以创建一个哈希表,哈希表的键为字母表的每个字母,而值为字母在字母表中的顺序

由于字母表中的字母数目是固定的,总共 26 个,因此可以用一个长度为 26 的数组来模拟哈希表,数组的下标对应哈希表的键,而数组的值对应哈希表的值。

代码实现

cpp 复制代码
class Solution {
private:
    bool isSorted(const string& word1, const string& word2, const vector<int>& orderArr) {
        int i = 0;
        while (i < word1.size() && i < word2.size())
        {
            if (orderArr[word1[i] - 'a'] < orderArr[word2[i] - 'a'])
                return true;
            
            if (orderArr[word1[i] - 'a'] > orderArr[word2[i] - 'a'])
                return false;
            
            ++i;
        }
        return i == word1.size();
    }
​
public:
    bool isAlienSorted(vector<string>& words, string order) {
        vector<int> orderArr(26, 0);  // 用数组模拟哈希表
        for (int i = 0; i < order.size(); ++i)
        {
            orderArr[order[i] - 'a'] = i;
        }
​
        for (int i = 0; i < words.size() - 1; ++i)
        {
            if (!isSorted(words[i], words[i + 1], orderArr))
                return false;
        }
        return true;
    }
};
相关推荐
雪球不会消失了7 分钟前
SpringMVC中的拦截器
java·开发语言·前端
钝挫力PROGRAMER8 分钟前
#!/bin/bash^M 坏的解释器:没有哪个文件或者目录
开发语言·bash
是十一月末8 分钟前
机器学习之KNN算法预测数据和数据可视化
人工智能·python·算法·机器学习·信息可视化
chenziang113 分钟前
leetcode hot100 路径总和
算法
lyx14260613 分钟前
leetcode 3083. 字符串及其反转中是否存在同一子字符串
算法·leetcode·职场和发展
茶猫_16 分钟前
力扣面试题 39 - 三步问题 C语言解法
c语言·数据结构·算法·leetcode·职场和发展
初学者丶一起加油18 分钟前
C语言基础:指针(数组指针与指针数组)
linux·c语言·开发语言·数据结构·c++·算法·visual studio
程序员大阳20 分钟前
闲谭Scala(1)--简介
开发语言·后端·scala·特点·简介
直裾21 分钟前
scala图书借阅系统完整代码
开发语言·后端·scala
百流21 分钟前
scala基础学习_运算符
开发语言·学习·scala