首页 > 其他分享 >单词接龙

单词接龙

时间:2024-11-27 20:45:15浏览次数:5  
标签:int 单词 ++ 接龙 words 长度

单词接龙是一个与我们经常玩的成语接龙相类似的游戏。

现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”,每个单词最多被使用两次。

在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish ,如果接成一条龙则变为 beastonish。

我们可以任意选择重合部分的长度,但其长度必须大于等于1,且严格小于两个串的长度,例如 at 和 atide 间不能相连。

输入格式
输入的第一行为一个单独的整数 n 表示单词数,以下 n 行每行有一个单词(只含有大写或小写字母,长度不超过20),输入的最后一行为一个单个字符,表示“龙”开头的字母。

你可以假定以此字母开头的“龙”一定存在。

输出格式
只需输出以此字母开头的最长的“龙”的长度。

数据范围
n≤20,
单词随机生成。

输入样例:
5
at
touch
cheat
choose
tact
a
输出样例:
23
提示

连成的“龙”为 atoucheatactactouchoose。

思路:
首先预处理g[][]数组,表示两个字符串之间最短的可重叠部分长度。

之后dfs爆搜,搜索所有情况,寻求符合条件并且可拼成最长的字符串长度。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 30;
int n;
string words[N];//存单词
int used[N];//记录每个单词的使用次数
int g[N][N];//g[i][j]存第i个单词能否接到第j个单词的后面,g[i][j]的值就是重合的长度
int res=0;

void dfs(string dragon, int x)
{
	res = max(res, (int)dragon.size());

	used[x]++;
	for (int i = 0; i < n; i++)
	{
		if (g[x][i] && used[x] < 2)
		{
			dfs(dragon + words[i].substr(g[x][i]), i);//告诉下一次递归调用要以第 i 个单词作为新的起点继续构建 “接龙” 序列。
		}
	}
	used[x]--;//回溯

}

int main()
{
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++)
	{
		cin >> words[i];
	}
	char start;
	cin >> start;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			string a = words[i], b = words[j];
			for (int k = 1; k < min(a.size(), b.size()); k++)
			{
				if (a.substr(a.size() - k, k) == b.substr(0, k))
				{
					g[i][j] = k;
					break;
				}
			}
		}
	}

	for (int i = 0; i < n; i++)
	{
		if (words[i][0] == start)
		{
			dfs(words[i], i);
		}
	}
	printf("%d", res);

	return 0;
}

标签:int,单词,++,接龙,words,长度
From: https://www.cnblogs.com/xuzhenxuexi/p/18573069

相关文章

  • P1321 单词覆盖还原
    带点小思维首先,这题的意思就是boy,girl,。这三个单词会相应覆盖,但每个单词至少有一个单词不会被覆盖,那我们观察这三个单词发现,其里面每个字符都没有重复的,也就是说,假设我看到了一个o,那很明显就是boy的,假如看到一个l,那就是girl的,由于我们不知道每个字符被覆盖前是啥字符,那我们可以......
  • Transformer为什么能处理不同长度的句子?T:输入的文字或英文单词量决定了T的长度,当不
    目录Transformer为什么能处理不同长度的句子?T:输入的文字或英文单词量决定了T的长度,当不足最大数时间进行补空;A:词嵌入维度/多头数文心一言最大是5809汉字一、自注意力机制(Self-AttentionMechanism)二、位置编码(PositionalEncoding)QWeights,KWeights,VWeights矩......
  • dsl 在打包构建生成代码中,是哪个英文单词的缩写
    在打包构建生成代码的上下文中,DSL通常是"Domain-SpecificLanguage"的缩写。Domain-SpecificLanguage(领域特定语言)DSL是一种计算机语言或规格,专门为解决特定领域的问题而设计。与通用编程语言(如Java、Python)不同,DSL专注于某一特定的应用领域,使得该领域的专家能够更容......
  • 『CSP-J 2024』 接龙
    linkCCF目前在CSP-J出过的唯一蓝题,也是个nggyu题。题目大意n个人进行接龙游戏,每人有一个长为\(l_i\)的序列\(S_i\)。规则接龙起始序列为\(\{1\}\)。每轮进行接龙的人不能是上一轮的人。当前玩家在自己的序列中选出一个满足接龙条件的连续子序列。选出的......
  • 【从零开始的LeetCode-算法】884. 两句话中的不常见单词
    句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。......
  • python代码将文件夹里面pdf全部出现单词出现频次显示出来并且出现意思,保存到excle
    英语考试和代码结合(自动化人哭了)需要教程可以私信我,我可以出视频B站importcsvimportrefromcollectionsimportCounterfrompdfminer.pdfparserimportPDFParserfrompdfminer.pdfdocumentimportPDFDocumentfrompdfminer.pdfpageimportPDFPagefrompdfmine......
  • 头歌测试 单词分割
    任务描述本关任务:将一段英语字符串进行单词分割。相关知识为了完成本关任务,你需要掌握:如何将字符串进行分割。String.split()拆分字符串lang包String类的split()方法publicString[]split(Stringregex)publicString[]split(Stringregex,intlimit)//limit参数控制......
  • 蓝桥杯刷题第一题:单词分析
    题目描述小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。现在,请你帮助小蓝,给了一个单词后,帮助他找......
  • LeetCode题练习与总结:单词规律--290
    一、题目描述给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入:pattern="abba",s="dogcatcatdog"输出:tr......
  • 编写一个程序递归判断一个字符串是否为回文。回文是指从前往后读和从后往前读都一样的
    defis_string_palindrome(string):iflen(string)<2:#设置出口returnTrueelse:#判断首末位是否相同ifstring[0]==string[len(string)-1]:#用列表来删除首末位相同字符list1=list(string)list1.pop(0)list1.pop()string=''.join(list1)#设置过程returnis_str......