活跃农民
- 积分
- 368
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2019-8-13
- 最后登录
- 1970-1-1
|
注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
哈喽大家,今天刷到269 Alien Dictionary 的时候, 用的BFS 方法,但是发现有个test case很奇怪,["ba", "bc"], 跑下来结果是"abc", 但是理想答案应该是"bac" 才对啊, 希望有明白的同学能给解答解答!!
- class Solution {
- public String alienOrder(String[] words) {
- int[] degree = new int[26];
- int count = 0;
- StringBuilder res = new StringBuilder();
-
- for (String word : words) {
- for (char c : word.toCharArray()) {
- if (degree[c - 'a'] == 0) {
- degree[c - 'a'] = 1;
- count++;
- }
- }
- }
-
- HashMap<Character, Set<Character>> map = new HashMap<>();
-
- for (int i = 0; i < words.length - 1; i++) {
- int len = Math.min(words[i].length(), words[i + 1].length());
- for (int j = 0; j < len; j++) {
- char cur = words[i].charAt(j);
- char next = words[i + 1].charAt(j);
- if (cur != next) {
- if (!map.containsKey(cur)) {
- map.put(cur, new HashSet<>());
- }
- if (map.get(cur).add(next)) {
- degree[next - 'a']++;
- }
- break;
- }
- if (j == words[i + 1].length() - 1 && words[i + 1].length() < words[i].length()) {
- return "";
- }
- }
- }
-
- Queue<Character> queue = new LinkedList<>();
- for (int i = 0; i < 26; i++) {
- if (degree[i] == 1) {
- queue.offer((char)(i + 'a'));
- }
- }
-
- while (!queue.isEmpty()) {
- Character c = queue.poll();
- res.append(c);
- if (map.containsKey(c)) {
- for (char ch : map.get(c)) {
- if (--degree[ch - 'a'] == 1) {
- queue.offer(ch);
- }
- }
- }
- }
-
- if (res.length() != count) return "";
-
- return res.toString();
- }
- }
复制代码
|
上一篇: 求解|地铁迷问题下一篇: 刷题相关疑问
|