《剑指 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;
    }
};
相关推荐
WL_Aurora几秒前
Python 算法基础篇之排序算法(二):希尔、快速、归并
python·算法·排序算法
枫叶林FYL几秒前
【强化学习】2 大规模并行强化学习中的耦合策略优化:受控多样性驱动的样本高效探索
开发语言·php
chao1898442 分钟前
基于MATLAB的音频信号AM调制与解调实现
开发语言·matlab·音视频
雨落在了我的手上4 分钟前
初识java(八):数组的定义与使用
java·开发语言
贵州晓智信息科技5 分钟前
曼德勃罗集的 Three.js 实现
开发语言·javascript·ecmascript
xiaoshuaishuai85 分钟前
C# CUDA 到 OpenCL 迁移
开发语言·windows·c#
闻缺陷则喜何志丹6 分钟前
【图论 树 启发式合并】P7165 [COCI2020-2021#1] Papričice|普及+
c++·算法·启发式算法·图论··洛谷
AI科技星6 分钟前
基于平行素数对等腰梯形网格拓扑的完备性证明哥德巴赫猜想1+1
c语言·开发语言·网络·量子计算·agi
聆风吟º7 分钟前
【C标准库】深入理解C语言 isdigit函数详解:判断字符是否为数字
c语言·开发语言·库函数·isdigit
alexwang2117 分钟前
AT_abc458_d [ABC458D] Chalkboard Median题解
c++·算法·题解·atcoder