✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字剪切下来,剪拼成匿名信。现在有一名举报人,希望借鉴这种手段,使用英文报刊完成举报操作。
但为了增加文章的混淆度,只需满足每个单词中字母数量一致即可,不关注每个字母的顺序解释:单词on允许通过单词’no’进行替代报纸代表newspaper,匿名信代表anonymousLetter,求报纸内容是否可以拼成匿名信。
2. 输入描述
第一行输入newspaper内容,包括1-N个字符串,用空格分开
第二行输入anonymousLetter内容,包括1-N个字符串,用空格分开
newspaper和anonymousLetter的字符串由小写英文字母组成且每个字母只能使用一次;
newspaper内容中的每个字符串字母顺序可以任意调整,但必须保证字符串的完整性(每个字符串不能有多余字母);
1<N<100 , 1<= newspaper.length, anonymousLetter.length <= 104;
3. 输出描述
如果报纸可以拼成匿名信返回ture,否则返回false。
4. Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String newspaper = sc.nextLine();
String anonymous = sc.nextLine();
String[] arr1 = newspaper.split(" ");
String[] arr2 = anonymous.split(" ");
Set<String> set = new HashSet<>();
for (String s : arr1) {
char[] charArray = s.toCharArray();
Arrays.sort(charArray);
String value = String.valueOf(charArray);
set.add(value);
}
boolean flag = true;
for (String s : arr2) {
char[] chars = s.toCharArray();
Arrays.sort(chars);
String str = String.valueOf(chars);
//如果有匿名的,在set里没有对应上,说明无法拼出,返回false
if (!set.contains(str)) {
flag = false;
break;
}
}
if (flag) {
System.out.println("true");
} else {
System.out.println("false");
}
}
5. 测试
示例输入 | 示例输出 |
---|---|
1. aac df 2. adf | false |
6.解题思路
- 读取输入的报纸内容和匿名信内容。
- 将报纸内容和匿名信内容分别以空格为分隔符拆分成字符串数组。
- 创建一个HashSet,用于存储报纸内容中每个字符串按字母排序后的值。
- 遍历报纸内容数组:
- 对于每个字符串,将其转换为字符数组,并按字母顺序进行排序。
- 将排序后的字符数组转换为字符串,并添加到HashSet中。
- 创建一个布尔变量flag,并将其初始化为true。
- 遍历匿名信内容数组:
- 对于每个字符串,将其转换为字符数组,并按字母顺序进行排序。
- 将排序后的字符数组转换为字符串。
- 如果HashSet中不包含该字符串,则将flag设为false,并跳出循环。
- 根据flag的值,输出"true"或"false"表示报纸是否可以拼成匿名信。
该算法的时间复杂度为O(N+M)
,其中N是报纸内容的长度,M是匿名信内容的长度。因为需要遍历两个字符串数组,对每个字符串进行排序,并将排序后的字符串存储到HashSet中。最终的空间复杂度为O(N)
,取决于HashSet的存储空间。