首页 > 其他分享 >【图论之拓扑排序】剑指 Offer II 114. 外星文字典

【图论之拓扑排序】剑指 Offer II 114. 外星文字典

时间:2023-04-12 17:11:15浏览次数:55  
标签:return Offer int res ++ II 114 words size

剑指 Offer II 114. 外星文字典

讲解传送门

const int N = 26, M = N * N;
class Solution {
public:
    int h[N], e[M], ne[M], idx = 0;
    bool st[N];
    int in[N], cnt = 0; // 上面三行要写在class Solution内部,不然每次调用不会清空
    void add(int a, int b)
    {
        e[idx] = b, ne[idx]= h[a], h[a] = idx ++ ;
    }

    bool build(string s, string t)
    {
        int n = min(s.size(), t.size());
        for (int i = 0; i < n; i ++ )
        {
            int a = s[i] - 'a', b = t[i] - 'a';
            if (a != b) 
            {
                add(a, b);
                in[b] ++ ;
                return true;
            }
        }
        return s.size() <= t.size(); // 必须要等号,因为字典里有两个一样的串也算构建成功
    }

    string alienOrder(vector<string>& words) {
        memset(h, -1, sizeof h);    
        int n = words.size();
        string res = "";
        for (int i = 0; i < n; i ++ )
        {
            for (auto c: words[i])
            {
                if (!st[c - 'a'])
                {
                    cnt ++ ;
                    st[c - 'a'] = true;
                }
            }
            for (int j = 0; j < i; j ++ )
            {
                if (!build(words[j], words[i])) 
                    return "";
            }
        }
        queue<int> q;
        for (int i = 0; i < 26; i ++ )
        {
            if (!in[i] && st[i])
                q.push(i);
        }
        while (q.size())
        {
            int t = q.front();
            q.pop();
            res += (char)(t + 'a');
            for (int i = h[t]; i != -1; i = ne[i])
            {
                int j = e[i];
                if (-- in[j] == 0)
                    q.push(j);
            }
        }
        return cnt == res.size() ? res : "";
    }
};

标签:return,Offer,int,res,++,II,114,words,size
From: https://www.cnblogs.com/Tshaxz/p/17310453.html

相关文章

  • 哈希表:剑指 Offer 48. 最长不含重复字符的子字符串
    题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。   提示:s.length<=40000 思路:双指针(滑动窗口)+哈希表:   复杂度分析:时间复杂度O(N):其中N为字符串长度,动态规划需遍历计算dp列表。空间复杂度O(1......
  • UVa 11498 Division of Nlogonia (water ver.)
    11498-DivisionofNlogoniaTimelimit:1.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2493TheProblemAftercenturiesofhostilitiesandskirmishesbetweenthefour......
  • 【剑指 Offer】 65. 不用加减乘除做加法
    【题目】写一个函数,求两个整数之和,要求在函数体内不得使用“+”、“-”、“*”、“/”四则运算符号。 示例:输入:a=1,b=1输出:2 提示:   a,b均可能是负数或0   结果不会溢出32位整数来源:力扣(LeetCode)链接:https://leetcode.cn/problems/bu-yong-jia-jian-c......
  • 哈希表:剑指 Offer 03. 数组中重复的数字
    题目描述:找出数组中重复的数字。在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。   限制:2<=n<=100000 哈希表/Set利用数据......
  • iis 7.5 下站点日志开启以及默认位置设置方法
       一直用iis6的日志管理,最近升级了2008所以打算启用一下iis7.5的日志,这里就为大家分享一下方法,需要的朋友可以参考下  在iis6时,通过iis管理器的日志配置可以找到站点日志存储的位置。但是在iis7下,iis管理器下的日志配置只能找到iis日志配置的主目录,......
  • MULTIINSTRUCT: Improving Multi-Modal Zero-Shot Learning via Instruction Tuning
    指令调优是一种新的学习范式,它可以根据指令指定的任务对预先训练好的语言模型进行微调,在各种自然语言处理任务中显示出良好的零目标性能。然而,对于视觉和多模态任务,它仍然没有被探索。在这项工作中,我们介绍了multiinstruction,这是第一个多模态指令调优基准数据集,由47个不同的多模......
  • 堆:剑指 Offer 41. 数据流中的中位数
    题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是3[2,3]的中位数是(2+3)/2=2.5设计一......
  • 力扣 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机 II
    121.买卖股票的最佳时机给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获......
  • 【剑指 Offer】 15. 二进制中1的个数
    【题目】编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为'1'的个数(也被称为汉明重量).)。 提示:   请注意,在某些语言(如Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是......
  • 【剑指 Offer】 33. 二叉搜索树的后序遍历序列
    【题目】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:    5   /\  2  6 /\ 1  3示例1:输入:[1,6,3,2,5]输出:false示例2:输入:......