《剑指 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;
    }
};
相关推荐
梵刹古音14 小时前
【C语言】 数组函数与排序算法
c语言·算法·排序算法
生命不息战斗不止(王子晗)14 小时前
2026面试大纲 - java数据结构与集合专题
java·数据结构·面试
女王大人万岁14 小时前
Go语言JSON标准库(encoding/json):功能解析与实战指南
服务器·开发语言·后端·golang·json
wjs202414 小时前
Scala 基础语法
开发语言
.ZGR.14 小时前
从游戏到实战的线程进阶之旅:智能无人机防空平台
java·开发语言·无人机
上海合宙LuatOS14 小时前
LuatOS ——fota 升级教程
开发语言·人工智能·单片机·嵌入式硬件·物联网·php·硬件工程
NWU_白杨14 小时前
智能无人机平台V4
java·开发语言·无人机
小高Baby@14 小时前
Go语言中面向对象的三大特性之继承的理解
开发语言·后端·golang
小高Baby@14 小时前
Go语言中面向对象的三大特性之封装的理解
开发语言·后端·golang
胖咕噜的稞达鸭14 小时前
算法日记:穷举vs暴搜vs深搜vs回溯vs剪枝--全排列
算法·深度优先·剪枝