我想玩猜字谜 leetcode算法题每日一练- 猜字谜

雕龙文库 分享 时间: 收藏本文

我想玩猜字谜 leetcode算法题每日一练- 猜字谜

算法题每日一练- 猜字谜

题目

外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。

字谜的迷面 按字符串形式给出我想玩猜字谜,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:

例如我想玩猜字谜,如果字谜的谜面是 “”我想玩猜字谜,那么可以作为谜底的单词有 “”, “”, 和 “”;而 “”(不含字母 “a”)以及 “”(其中的 “s” 没有出现在谜面中)都不能作为谜底。

返回一个答案数组 ,数组中的每个元素 [i] 是在给出的单词列表 中可以作为字谜迷面 [i] 所对应的谜底的单词数目。

示例:

输入:words = ["aaaa","asas","able","ability","actt","actor","access"], puzzles = ["aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"]输出:[1,1,3,2,4,0]解释:1 个单词可以作为 "aboveyz" 的谜底 : "aaaa" 1 个单词可以作为 "abrodyz" 的谜底 : "aaaa"3 个单词可以作为 "abslute" 的谜底 : "aaaa", "asas", "able"2 个单词可以作为 "absoryz" 的谜底 : "aaaa", "asas"4 个单词可以作为 "actresz" 的谜底 : "aaaa", "asas", "actt", "access"没有单词可以作为 "gaswxyz" 的谜底,因为列表中的单词都不含字母 'g'

提示:

分析

实现这题的思路其实很简单:

首先,根据题意得符合谜底的必要条件: 必须由谜面中的字符组成,即一个谜底word中的字符一定都来源于一个谜面。谜底必须包含谜面中的第一个字符。 明白了两个必要条件,所以思路就出来了,遍历所有谜面,将谜底逐个代入进去验证是否满足条件。 实现

public static List<Integer> findNumOfValidWords(String[] words, String[] puzzles) { List<Integer> result = new ArrayList<>(); int count; boolean flag = false; // 遍历谜面 for (String puzzle : puzzles) { count = 0; // 遍历数组 for (String word : words) { // 第一个条件,谜底必须包含谜面puzzle中的第一个字符 if (word.contains(Character.toString(puzzle.charAt(0)))) { for (int k = 0; k < word.length(); k++) { char c = word.charAt(k); // 第二个条件,谜底的字符全部来源于谜面的字符 if (!puzzle.contains(Character.toString(c))) { flag = false; break; } flag = true; } if (flag){ count++; } } } result.add(count); } return result; }

总结

时间复杂度为O(MNV),即谜底的长度谜面word的长度单个字符串的长度,空间复杂度为O(N),即对应谜底的结果集合。当然,本题是存在优化点的,就是使用的思想,减少一层遍历,读者可以查看官方题解-猜字谜

免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表本站的观点和立场和对其真实性负责。如需转载,请联系原作者。如果来源标注有误或侵犯了您的合法权益或者其他问题不想在本站发布,来信即删。