1.链接:查找兄弟单词__牛客网
来源:牛客网
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。
数据范围:1≤n≤1000 1 \le n \le 1000 \ 1≤n≤1000 ,输入的字符串长度满足 1≤len(str)≤10 1 \le len(str) \le 10 \ 1≤len(str)≤10 , 1≤k<n 1 \le k < n \ 1≤k<n
输入描述:
输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k
输出描述:
第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
示例1
输入
3 abc bca cab abc 1
输出
2 bca
示例2
输入
6 cab ad abcd cba abc bca abc 1
输出
3 bca
说明
abc的兄弟单词有cab cba bca,所以输出3 经字典序排列后,变为bca cab cba,所以第1个字典序兄弟单词为bca
import java.util.*;
public class Main{
public static boolean isBrother(char[] str1,char[] str2){
//两个字符串长度不相等,则返回false
if(str1.length != str2.length){
return false;
}
//如果两个字符串相同,则直接输出false
String strA = new String(str1);
String strB = new String(str2);
if(strA.equals(strB)){
return false;
}
//排序之后,如果两个字符串相等,则是兄弟字符
Arrays.sort(str1);
Arrays.sort(str2);
strA = new String(str1);
strB = new String(str2);
return strA.equals(strB);
}
public static void main(String[] args){
Scanner sca = new Scanner(System.in);
while(sca.hasNext()){
String[] ret = sca.nextLine().split(" ");
int n = Integer.parseInt(ret[0]);
String[] arr = new String[n];
for(int i = 0;i < n;i++){
arr[i] = ret[i+1];
}
//要比较的单词X
String curStr = ret[n+1];
int k = Integer.parseInt(ret[n+2]);
Arrays.sort(arr);
int count = 0;
String kstr = "";
for(String e : arr){
if(isBrother(e.toCharArray(),curStr.toCharArray())){
count++;
if(count == k){
kstr = e;
}
}
}
System.out.println(count);
if(count >= k){
System.out.println(kstr);
}
}
}
}
2.乒乓球框
链接:乒乓球筐__牛客网
来源:牛客网
nowcoder有两盒(A、B)乒乓球,有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类,并且每种球的数量不少于B盒中的数量,该怎么办呢?
输入描述:
输入有多组数据。 每组数据包含两个字符串A、B,代表A盒与B盒中的乒乓球,每个乒乓球用一个大写字母表示,即相同类型的乒乓球为相同的大写字母。 字符串长度不大于10000。
输出描述:
每一组输入对应一行输出:如果B盒中所有球的类型在A中都有,并且每种球的数量都不大于A,则输出“Yes”;否则输出“No”。
示例1
输入
ABCDFYE CDE<br/>ABCDGEAS CDECDE
输出
Yes<br/>No
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sca = new Scanner(System.in);
String strA;
String strB;
while(sca.hasNext()){
String[] strArr = sca.nextLine().split(" ");
strA = strArr[0];
strB = strArr[1];
char[] arrA = strA.toCharArray();
char[] arrB = strB.toCharArray();
HashMap<Character,Integer> mapA = new HashMap<>();
HashMap<Character,Integer> mapB = new HashMap<>();
//1.计算arrA中字符个数
for(char ch : arrA){
mapA.put(ch,mapA.getOrDefault(ch,0)+1);
/*if(mapA.containsKey(ch)){
mapA.put(ch, mapA.get(ch) + 1);
}else{
mapA.put(ch, 1);
}*/
}
//2.计算arrB中字符个数
for(char ch : arrB){
mapB.put(ch,mapB.getOrDefault(ch,0)+1);
/*if(mapB.containsKey(ch)){
mapB.put(ch, mapB.get(ch) + 1);
}else{
mapB.put(ch, 1);
}*/
}
boolean ret = true;
//3.互相比较arrA中字符和arrB中字符个数
for(char ch : arrB){
if(!mapA.containsKey(ch) || mapA.get(ch) < mapB.get(ch)){
ret = false;
break;
}
}
if(ret){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
}
}