【名词解释】
在一行上依次输入:
一个整数
代表字符串的个数;
个长度为
,仅由小写字母构成的字符串
;
一个长度为
,仅由小写字母构成的字符串
;
一个整数
代表要查找的第
小的兄弟单词的序号。
第一行输出一个整数,代表给定的
个字符串中,
的“兄弟单词”的数量;
第二行输出一个字符串,代表将给定的
个字符串中
的“兄弟单词”按字典序排序后的第
小兄弟单词。特别地,如果不存在,则不输出任何内容(完全省略第二行)。
3 abc bca cab abc 1
2 bca
在这个样例中,
的兄弟单词为
、
、
、
、
。其中,标橙色的两个字符串存在于所给定的
个字符串中。第
小的兄弟单词为
。
3 a aa aaa a 1
0
在这个样例中,按照定义,字符串
没有兄弟单词。
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-05-30 更新题面。
2. 2024-12-29 更新题面。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.TreeMap;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.valueOf(in.next());
TreeMap<Integer, String> map =new TreeMap<>();
TreeMap<Integer, String> map1 =new TreeMap<>();
for(int i=0; i<n; i++){
String str0 = in.next();
map.put(i,str0);
// System.out.println(str0);
}
String str1 = in.next();
int count =0;
for(int i : map.keySet()){
String temp = map.get(i);
char[] temp1 = temp.toCharArray();
Arrays.sort(temp1);
String temp3 = String.valueOf(temp1);
char[] temp2 = str1.toCharArray();
Arrays.sort(temp2);
String temp4 = String.valueOf(temp2);
if(!map.get(i).equals(str1)){
if(temp3.equals(temp4)){
count++;
// System.out.println("不等但排列后相等");
map1.put(i, temp);
}
// System.out.println("不等");
}
}
System.out.println(count);
for(int m: map1.keySet()){
System.out.println(map1.get(m));
break;
}
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String[] ss = s.split(" ");
int n = Integer.parseInt(ss[0]);
int k = Integer.parseInt(ss[ss.length-1]);
String st = ss[ss.length-2];
char[] x = st.toCharArray();
Arrays.sort(x);//对x进行排序
int result = 0; //存储有多少兄弟字符
List list = new ArrayList();//存储兄弟字符
for (int i = 1; i < n+1; i++) {
int count = 0;//计数,记录排序后数组中相同的字符
//如果长度都不相同,那一定不相同
if (ss[i].length() != st.length()) {
continue;
}
//在未排序前就相同,也不是兄弟字符
if (ss[i].equals(st)){
continue;
}
//拿到ss中的数据,并转化成char数组,然后进行排序
String compare = ss[i];
char[] com = compare.toCharArray();
Arrays.sort(com);//对com进行排序
// 比较排序后的char数组,x,com
for (int j = 0; j < st.length(); j++) {
if (x[j] == com[j]) {
count++;
}else break;
}
//与st比较字符串长度相同时,为兄弟字符
if (count == st.length()) {
result++;
list.add(ss[i]);
}
}
Collections.sort(list);
//输出有多少兄弟单词
System.out.println(result);
//如果k有效,则输出第k个兄弟单词
if(k-1<list.size()){
System.out.println(list.get(k-1));
}
}
} 我这大概是最简单的思路了
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String input = in.nextLine();
String[] strs = input.split(" ");
int n = Integer.valueOf(strs[0]);
int k = Integer.parseInt(strs[strs.length - 1]);
String x = strs[strs.length - 2];
char[] chx = x.toCharArray();
Arrays.sort(chx);
ArrayList<String> als = new ArrayList<>();
//逐个判断每个单词是否是兄弟单词
for (int i = 1; i <= n; i++) {
if (x.equals(strs[i]) || strs[i].length() != x.length()) {
continue;//长度相等或字符串相等则非兄弟字符
} else {
char[] chs = strs[i].toCharArray();
Arrays.sort(chs);
if (Arrays.equals(chx, chs)) {
als.add(strs[i]);//是兄弟字符久添加
}
}
}
als.sort((o1, o2)-> {return o1.compareTo(o2);}); //字符串列表按字典升序排序
System.out.println(als.size());
if (k <= als.size()) {
System.out.println(als.get(k - 1));//k在兄弟单词范围内时输出
}
}
}
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String []str=in.nextLine().split(" ");
int indexLookFor=Integer.valueOf(str[str.length-1]);
String bro=str[str.length-2];
int len=bro.length();
ArrayList<String> res=new ArrayList<>();
char[]temp=bro.toCharArray();
Arrays.sort(temp);
getbro(new String(temp),res,new boolean[bro.length()],new StringBuilder());
ArrayList<String>then=new ArrayList<>();
for(int i=1;i<str.length-2;++i){
if(str[i].length()!=bro.length())continue;
if(res.contains(str[i])&&!str[i].equals(bro)){
then.add(str[i]);
}
}
then.sort(null);
System.out.println(then.size());
if(!then.isEmpty()&&indexLookFor-1<then.size()){
System.out.println(then.get(indexLookFor-1));
}
}
public static void getbro(String bro,ArrayList<String>res,boolean[]used,StringBuilder sb){
if(sb.length()==bro.length()){
res.add(new String (sb.toString()));
return;
}
for(int i=0;i<bro.length();++i){
if(used[i]||(i>1&&bro.charAt(i)==bro.charAt(i-1)&&!used[i-1])){
continue;
}
used[i]=true;
sb.append(bro.charAt(i));
getbro(bro,res,used,sb);
sb.delete(sb.length()-1,sb.length());
used[i]=false;
}
}
} 先找被求的String的全排列去掉本身算兄弟数组,然后在将满足兄弟数组的String从列表里面找出来,自然排序
TreeMap保证key的字典序比较麻烦,性能较差。可以用List来存储,再用Collections.sort()来排序性能要更高,
另外返回结果时不需要一个个去遍历TreeMap,直到遍历了k个字符串再返回。用List可以直接取k - 1索引的字符串即可(如果有)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] str = in.nextLine().split(" ");
int n = Integer.valueOf(str[0]);
int k = Integer.valueOf(str[str.length - 1]);
String target = str[str.length - 2];
char[] sortedTarget = target.toCharArray();
Arrays.sort(sortedTarget);
int sum = 0;
ArrayList<String> list = new ArrayList<>();
for (int i = 1; i < str.length - 2; i++) {
char[] SortedTemp = str[i].toCharArray();
Arrays.sort(SortedTemp);
if (str[i].length() == target.length() && !str[i].equals(target) &&
Arrays.equals(sortedTarget, SortedTemp)) {
list.add(str[i]);
sum++;
}
}
Collections.sort(list);
System.out.println(sum);
if (list.size() >= k) {
System.out.println(list.get(k - 1));
}
}
} import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String str = in.nextLine();//获取输入的字符串
String[] arr = str.split(" ");//按照" "分割,获取数组
int n = Integer.parseInt(arr[0]);//第一个为输入的单词数量
String[] arr2 = new String[n];//创建单词数组存储单词
for (int i = 1; i <= n ;i++){//将单词存入单词数组中
arr2[i-1]=arr[i];
}
//倒数第二个为需要对比的单词
String x = arr[arr.length-2];
int xLength = x.length();
//需要对比的单词取出所有的字符,并且进行排序
char[] xChars = x.toCharArray();
Arrays.sort(xChars);
String xSort = new String(xChars);
//最后一位为要输出第几位兄弟单词
int k = Integer.parseInt(arr[arr.length-1]);
//存储arr2中所找到的兄弟单词
List<String> arr2Brother = new ArrayList<>();
//列出arr2中含有的x的兄弟单词
for (int i = 0;i < arr2.length;i++){
if (arr2[i].length() != xLength || arr2[i].equals(x)){
//长度不同,必不可能为兄弟单词,相同,也不是兄弟单词
continue;
}
char[] temp = arr2[i].toCharArray();
Arrays.sort(temp);
if (new String(xChars).equals(new String(temp))){
arr2Brother.add(arr2[i]);
}
}
//排序兄弟单词
arr2Brother.sort(Comparator.naturalOrder());//升序 arr2Brother.sort(null);
//arr2Brother.sort(Comparator.reverseOrder());//降序
System.out.println(arr2Brother.size());//输出兄弟单词个数
if (arr2Brother.size()>0 && k <= arr2Brother.size()){//如果k小于兄弟单词列表长度,则需要输出的兄弟单词存在
System.out.println(arr2Brother.get(k-1));
}
//列出x所有的兄弟单词 效率低
// List<String> brother = new ArrayList<>();
// List<String> result = new ArrayList<>();
// brotherFind(x.toCharArray(),0,brother);
// int count = 0;
// for (int i = 0; i < arr2.length;i++){
// if (arr2[i].equals(x) || arr2[i].length() != xLength){//如果是相同的单词或者长度不同,则跳过
// continue;
// } else if (brother.contains(arr2[i])){
// count++;
// result.add(arr2[i]);
// }
// }
// result.sort(null);
// System.out.println(count);
// if (k <= result.size() && k > 0) {//如果k小于兄弟单词列表长度,则需要输出的兄弟单词存在
// System.out.println(result.get(k-1));
// }
}
//列出所有的兄弟单词
public static void brotherFind(char[] chars,int start ,List<String> result){
/** 从第start位开始固定,并与之后的字符进行替换 */
if (start == chars.length){
result.add(new String(chars));
} else {
for (int i = start; i < chars.length; i++){
//从第start位开始固定,并与之后的字符进行替换
swap(chars,start,i);
brotherFind(chars,start+1,result);//递归,找到第start位所有的兄弟单词
swap(chars,start,i);//将替换过的字符替换回来
}
}
}
public static void swap(char[] chars,int x,int y){
char temp = chars[x];
chars[x] = chars[y];
chars[y] = temp;
}
} package com.hw.nk;
import java.util.*;
/*
思路:
1. 将字符型x切割成字符串,并统计每个字符串出现了几次
2. 将输入的比较字符串集合,也分别切割成字符串,并统计每个字符串出现了几次
3. 上述的都用TreeMap集合存储,所以是有序的,如果集合equals比较,相等即为兄弟串(因为每种字符只要出现次数一样,不管如何排序都一样的)
4. 当为兄弟串时,存储集合的索引,便于后续输出
*/
public class Test27 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String[] s1 = s.split(" ");
String sourceStr = s1[s1.length-2];
int k = Integer.parseInt(s1[s1.length-1]);
List<String> list = new ArrayList();
for (int i = 1; i < s1.length - 2; i++) {
list.add(s1[i]);
}
TreeMap<Character,Integer> sourceMap = new TreeMap<>();
for (char c : sourceStr.toCharArray()){
sourceMap.put(c,sourceMap.getOrDefault(c,0)+1);
}
int num = 0;
List<Integer> result = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if(!list.get(i).equals(sourceStr)){
TreeMap<Character,Integer> targetMap = new TreeMap<>();
for (char c : list.get(i).toCharArray()){
targetMap.put(c,targetMap.getOrDefault(c,0)+1);
}
if(targetMap.equals(sourceMap)){
result.add(i);
num++;
}
}
}
System.out.println(num);
if(num != 0 && num >= k){
System.out.println(list.get(result.get(k-1)));
}
}}
用例通过率90%,还有10%哪位大佬能帮忙看看
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int a = in.nextInt();
List<String> word = new ArrayList<>();
for (int i = 0; i < a; i++) {
word.add(in.next());
}
String target = in.next();
int index = in.nextInt();
List<String> bratherList = new ArrayList<>();
char[] targetarr = target.toCharArray();
Arrays.sort(targetarr);
word.forEach(e-> {
if (e.length() == target.length() && !e.equals(target)) {
char[] ee = e.toCharArray();
Arrays.sort(ee);
Boolean flag = true;
for(int i=0;i<ee.length;i++){
if(ee[i] != targetarr[i]) flag=false;
}
if (flag) {
bratherList.add(e);
}
}
});
bratherList.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
System.out.println(bratherList.size());
// 如果得到的下标超过兄弟列表数组,不输出
if((index-1)<bratherList.size()){
System.out.println(bratherList.get(index - 1));}
}
} import java.util.*;
import java.util.stream.Collectors;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String[] input = in.nextLine().split(" ");
int length = Integer.parseInt(input[0]);
String x = input[length+1];
int index = Integer.parseInt(input[length+2]);
List<String> list = new ArrayList<>();
for(int i=0;i<length;i++){
list.add(input[i+1]);
}
// 过滤掉完全一致,以及长度不符合的单词
List<String> list2 = list.stream().filter(a->((a.compareTo(x)!=0)&&(a.length()==x.length()))).collect(Collectors.toList());
List<String> list3 = new ArrayList<>();
// 判断兄弟数
for(String item : list2){
String item1 = item;
String x1 = x;
boolean isBro = true;
for(int i =0;i<item.length();i++){
String ch = item.charAt(i)+"";
// 两者同时去除同样的字符,若去除过程中出现两个单词长度不一致的情况,则不是兄弟数
item1 = item1.replace(ch,"");
x1 = x1.replace(ch,"");
if(x1.length() != item1.length()){
isBro = false;
break;
}
}
if(isBro){
list3.add(item);
}
}
// 按照字典排序
list3.sort((a,b)->a.compareTo(b));
System.out.println(list3.size());
// 兄弟数不少于1,并且给定下标小于等于兄弟数量,则打印指定下标的兄弟数
if((index-1)<=list3.size() && (list3.size()!=0)){
System.out.println(list3.get(index-1));
}
}
}
} import java.util.Scanner;
import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String s = in.nextLine();
String[] arr = s.split(" ");
int target = Integer.parseInt(arr[arr.length-1]);
String targetStr = arr[arr.length-2];
String[] targetArr = targetStr.split("");
Arrays.sort(targetArr);
List<String> targetList = Arrays.asList(targetArr);
Map<List<String>,String> map = new HashMap<>();
map.put(targetList,targetStr);
List<String> resList = new ArrayList<>();
for (int i=1;i<arr.length-2;i++) {
String item = arr[i];
String[] itemArr = item.split("");
Arrays.sort(itemArr);
List<String> itemList = Arrays.asList(itemArr);
if (map.get(itemList) != null && !targetStr.equals(item)) {
resList.add(item);
}
}
System.out.println(resList.size());
Collections.sort(resList);
if (target - 1 < resList.size()) {
System.out.println(resList.get(target - 1));
}
}
}
} import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String nextLine = sc.nextLine();
String[] strings = nextLine.split(" ");
int num = Integer.parseInt(strings[0]);
int find = Integer.parseInt(strings[num + 2]);
ArrayList<String> arrayList = new ArrayList<>();
for (int i = 1; i < strings.length - 2; i++) {
arrayList.add(strings[i]);
}
//Collections.sort(arrayList);
String target = strings[num + 1];
char[] chars = target.toCharArray();
Arrays.sort(chars);
int sum = 0;
ArrayList<String> brother = new ArrayList<>();
for (String s : arrayList) {
char[] charArray = s.toCharArray();
Arrays.sort(charArray);
if (Arrays.equals(charArray, chars) && !s.equals(target)){
sum++;
brother.add(s);
//System.out.println(s);
}
}
System.out.println(sum);
Collections.sort(brother);
if (find < brother.size()){
System.out.println(brother.get(find - 1));
}
}
} import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
List<String> r = new ArrayList();
while (n -- > 0) {
r.add(in.next());
}
String t = in.next();
int x = in.nextInt();
List<String> result = new ArrayList();
for (String st : r) {
if (st.length() != t.length() || st.equals(t)) {
continue;
}
// 这里不能用set,会去重,人傻了
List<String> set = new ArrayList(Arrays.asList(t.split("")));
for (int i = 0; i < st.length(); ++ i) {
set.remove(st.charAt(i) + "");
}
if (set.isEmpty()){
result.add(st);
}
}
Collections.sort(result);
System.out.println(result.size());
if (x < result.size()) {
System.out.println(result.get(x - 1));
}
}
} import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
List<String> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
String item = in.next();
list.add(item);
}
Collections.sort(list);
String target = in.next();
int index = in.nextInt();
int count = 0;
String targetWord = "";
char[] arr1 = target.toCharArray();
Arrays.sort(arr1);
for (String word : list) {
if (word.equals(target) || word.length() != target.length()) {
continue;
}
char[] arr2 = word.toCharArray();
Arrays.sort(arr2);
if (!Arrays.equals(arr1, arr2)) {
continue;
}
count ++;
if (count == index) {
targetWord = word;
}
}
System.out.println(count);
System.out.println(targetWord);
}
}