字符串中等 HJ27 查找兄弟单词

HJ27 查找兄弟单词

描述

定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。

数据范围:1 \le n \le 1000 \1≤n≤1000 ,输入的字符串长度满足 1 \le len(str) \le 10 \1≤len(str)≤10 , 1 \le k < n \1≤k<n
输入描述:
输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k
输出描述:
第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
示例1

分析

按要求获取字符串,注意使用next()而不是nextLine().
获取字符串得兄弟字符串,然后打印第k个字符串。

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        String[] str = new String[n];
        for (int i = 0; i < n; i++) {
            str[i] = scan.next();
        }
        String s = scan.next();
        int k = scan.nextInt();
        char[] ch = s.toCharArray();
        Arrays.sort(ch);
        List<String> list = new ArrayList<>();
        for (String st : str) {
            if (st.equals(s)) {
                continue;
            }
            if (process(st,ch)) {
                list.add(st);
            }
        }
        Collections.sort(list,new Comparator<String>(){
           public int compare(String a, String b) {
               return a.compareTo(b);
           }
        });
//         Collections.sort(list,(a,b)->(a.compareTo(b)));
        if (list.size() < k) {
            System.out.println(list.size());
        } else {
            System.out.println(list.size());
            System.out.println(list.get(k-1));
        }
    }
    
    public static boolean process(String str, char[] ch) {
        if (str.length() != ch.length) {
            return false;
        }
        char[] s = str.toCharArray();
        Arrays.sort(s);
        for (int i = 0; i < str.length(); i++) {
            if (s[i] != ch[i]) {
                return false;
            }
        }
        return true;
    }
    
    public static int compare(String a, String b) {
        int i = 0;
        while (i < a.length() && i < b.length()) {
            if (a.charAt(i) != b.charAt(i)) {
                return a.charAt(i) - b.charAt(i);
            } 
            i++;
        }
        return 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值