HJ27 查找兄弟单词

88 阅读2分钟

Problem: HJ27 查找兄弟单词

题目描述

描述

定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。

兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。

现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?

注意:字典中可能有重复单词。
数据范围:1n10001≤n≤1000

输入描述:

输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k

输出描述:

第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。

示例1

输入:3 abc bca cab abc 1

输出:2 bca

算法流程

  1. 首先,将单词 x 排序,得到它的字母表表示形式 sorted_x。
  2. 遍历给定的 n 个单词,对每个单词按照以下规则进行处理:
  • 如果当前单词的长度与 x 的长度不同,则跳过该单词。
  • 否则,将当前单词排序,得到它的字母表表示形式 sorted_word。
  • 如果 sorted_word 等于 sorted_x 且当前单词不等于 x,则将该单词添加到兄弟单词列表中。
  1. 对兄弟单词列表进行排序。
  2. 返回兄弟单词列表中第 k 个单词。

代码

function findBrotherWord(words, x, k) {
  const sortedX = x.split('').sort().join('');
  const brotherWords = [];

  for (let i = 0; i < words.length; i++) {
    if (words[i].length !== x.length) {
      continue;
    }

    const sortedWord = words[i].split('').sort().join('');
    if (sortedWord === sortedX && words[i] !== x) {
      brotherWords.push(words[i]);
    }
  }

  brotherWords.sort();

  if (k > brotherWords.length) {
    return 'No brother word found.';
  } else {
    return brotherWords[k - 1];
  }
}

复杂度

  • 时间复杂度: O(n)O(n)

  • 空间复杂度: O(n)O(n)