golang力扣leetcode 剑指Offer II 114. 外星文字典

简介: golang力扣leetcode 剑指Offer II 114. 外星文字典

剑指Offer II 114. 外星文字典

剑指Offer II 114. 外星文字典

题解

题目:这题题目属实写的跟屎一样,样例给的也有问题

现在有一种外星文,与a…z顺序不同,给出一个用外星文构造的字符串列表。

注意:

  1. 字符串内部的字符排列,不是根据外星文排序的
  2. 字符串与字符串之间,谁排在前面,谁排在后面,是根据外星文排序的

请根据该字符串数组,还原出外星人字典序。如果不存在合法字母顺序,返回”“,答案可能有多个,返回任意一个。

在两个字符串相同下标的字符,称为ch1和ch2,在第二种情况中,排在前面的字符串,必定ch1 < ch2 。如果字符相同,len(word1) < len(word2) 。

思路:

其实很容易想到拓扑排序,恶心的是题目描述,重点在于注意那里
1. 既然字符串内部的字符串排列顺序是未知的
2. 那么只能通过相同字符串来建边
3. abc,ab这种样例是不应该出现的,但是样例里面有,题目说给定的是按照排序后的数组,那只能算这种是不合法的了。
4. 对于这种情况,就判断len(word1) > len(word2)
5. 一旦在相同下标有不相等的字符,就立马建边,break,由于现在下标字符的优先级,后面的字符是不可靠的了
6. 建边之后拓扑排序即可

代码

func alienOrder(words []string) string {
  inDeg := make(map[byte]int)
  graph := make(map[byte][]byte)
  for _, word := range words {
    for _, ch := range word {
      inDeg[byte(ch)] = 0 //统计外星文一共有多少字符
    }
  }
  for i := 0; i < len(words)-1; i++ {
    word1 := words[i]
    word2 := words[i+1]
    flag := false
    for j := 0; ; j++ {
      ch1 := word1[j]
      ch2 := word2[j]
      if ch1 != ch2 { //判断两个单词的字符是否一样
        graph[ch1] = append(graph[ch1], ch2) //不同则建边
        inDeg[ch2]++                         //入度加一
        break
      }
      if j == len(word1)-1 || j == len(word2)-1 { //如果flag为true说明字符都相同
        flag = true
        break
      }
    }
    if flag && len(word1) > len(word2) { //abc ab的情况,不合法
      return ""
    }
  }
  ans := make([]byte, 0)
  for k, v := range inDeg {
    if v == 0 { //对于入度为0的字符来说,我们无法确定其顺序,直接加入即可
      ans = append(ans, k)
    }
  }
  queue := make([]byte, len(ans))
  copy(queue, ans)
  for len(queue) > 0 { //拓扑排序
    u := queue[0]
    queue = queue[1:]
    for _, v := range graph[u] {
      inDeg[v]--
      if inDeg[v] == 0 {
        ans = append(ans, v)
        queue = append(queue, v)
      }
    }
  }
  if len(ans) == len(inDeg) { //如果存在环,那么ans必定缺少字符
    return string(ans)
  }
  return ""
}
目录
相关文章
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
1月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
1月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
78 0
|
1月前
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
30 0
|
1月前
|
存储
力扣(LeetCode)数据结构练习题
力扣(LeetCode)数据结构练习题
52 0
|
3月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
23 3
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
39 3
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
34 2
|
3月前
|
Go 开发者
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
117 4
Golang语言之管道channel快速入门篇