每日OJ_牛客_查找兄弟单词(排序+模拟)

目录

牛客_查找兄弟单词(排序+模拟)

解析代码


牛客_查找兄弟单词(排序+模拟)

题目:

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

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

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

注意:字典中可能有重复单词。


解析代码

题意解析:

        兄弟单词的含义:两个单词不同, 长度相同, 但是构成的字母顺序不相同输入描述: 先输入字典中单词的个数n,再输入n个单词作为字典单词。 再输入一个单词,查找其在字典中兄弟单词的个数m 再输入数字k 输出描述: 根据输入,输出查找到的兄弟单词的个数m 然后输出查找到的兄弟单词的第k个单词。 注意!! 一定要关注最终返回的第 k 个单词这样的序号, 不能搞错. 题意说的是 "字典", 因此要将里面的单词按照字典序排序,否则得到的 k 会存在问题。

解题思路:

  1. 将字典中的单词先放到 vector 中。
  2. 将 vector 进行排序。
  3. isBrother 函数依次判定每个输入的单词是否是兄弟单词。

判定兄弟单词的规则是 :

  • 先判定长度。
  • 如果长度相同, 再看是否是完全相同(完全相同不算兄弟)。
  • 然后将两个单词排序, 排序相同才是真兄弟单词。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

bool isBrother(string str1, string str2)
{
	// 大小相同
	if (str1.size() != str2.size())
		return false;
	// 字符顺序不同, 内容不同
	if (str1 == str2)
		return false;
	// 排序之后,内容相同
	sort(str1.begin(), str1.end());
	sort(str2.begin(), str2.end());
	return str1 == str2;
}
int main()
{
	int n = 0, k = 0;
	vector<string> vec;
	string curStr;
	while (cin >> n)
	{
		vec.clear();
		for (int i = 0; i < n; ++i)
		{
			string str;
			cin >> str;
			vec.push_back(str);
		}
		cin >> curStr;
		cin >> k;
		// 给候选按照字典序排序
		sort(vec.begin(), vec.end());
		// 遍历,查找兄弟单词
		int count = 0;
		string kStr;
		for (string& s : vec)
		{
			if (isBrother(s, curStr))
			{
				++count;
				// 记录第k个兄弟单词
				if (count == k)
					kStr = s;
			}
		}
		cout << count << endl;
		if (count >= k)
			cout << kStr << endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GR鲸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值