P1019题解 单词接龙(c++ 求两字符串最短重叠字串)

31 篇文章 2 订阅
订阅专栏
文章介绍了如何使用贪心算法来解决P1019单词接龙问题,重点在于找到两个字符串之间的最小重叠子串,以形成最长的连接字符串。提供了两种不同的方法实现检查最小重叠子串,并进一步讨论了如何通过深度优先搜索(DFS)遍历所有字符串,计算多个字符串的最长长度,同时确保每个字符串使用不超过两次。
摘要由CSDN通过智能技术生成

P1019 单词接龙

洛谷传送门:
添加链接描述

本题重点:利用贪心思想,得到的合成的字符串长度最长,则这两个字符串一定存在最小的重叠字串,这样才是最长的。

每个字符串之间的最小重叠子串以使得一个字符串可以追加在另一个字符串的末尾,从而形成一条 ”龙“字符串

在这里插入图片描述


现在的问题?
如何求得两个字符串的最小重叠子串

方法一:

int check(string str1,string str2)
{   
	//得到两个字符串的最短长度
    for (int i=0;i<min(str1.length(),str2.length());i++)
    {
        bool fg=true;
        //根据
        for (int j=0;j<=i;j++)
        {
            if (str1[str1.length()-i+j-1]!=str2[j])
            {
                fg=false;
            }
        }
        //如果fg为true,说明在这一次遍历中存在一个最短重叠子串,直接返回 i+1(i+1为这个子串的长度)
        if (fg) return i+1;
    }
    return 0;   //无最小重叠部分
}

方法二: 注意 i 的值等细节不一样

int check(string str1,string str2)
{   
    for (int i=1;i<min(str1.length(),str2.length());i++)
    {
        bool fg=true;
        for (int j=0;j<i;j++)
        {
            if (str1[str1.length()-i+j]!=str2[j])
            {
                fg=false;
            }
        }
        if (fg) return i;
    }
    return 0;   //无最小重叠部分
}

接下来的问题: 如何求得多个字符串的最长长度?

dfs遍历每一个字符串。依次求出每一个字符串之间的最小重叠子串,并且在dfs开始时进行长度的统计,取最大长度值,当字符串的出现次数多于两次时则跳过这个字符串,继续遍历下一个字符串,执行相同的操作,另外还需要进行回溯,以便可以求出求出所有的可能情况。

完整代码:

#include<bits/stdc++.h>
using namespace std;

int n,c;
const int SIZE=25;
vector<string> s(SIZE);
int vis[SIZE]; 
int res=0;
/*
check: 得到两个字符串的最小重叠子串的长度
*/
int check(string str1,string str2)
{   
    for (int i=0;i<min(str1.length(),str2.length());i++)
    {
        bool fg=true;
        for (int j=0;j<=i;j++)
        {
            if (str1[str1.length()-i+j-1]!=str2[j])
            {
                fg=false;
            }
        }
        if (fg) return i+1;
    }
    return 0;   //无最小重叠部分
}
void dfs(string str,int len)
{
    //更新最大长度
    res=max(res,len);
    for (int i=0;i<n;i++)
    {
        if (vis[i]>=2) continue;            //该字符串使用次数需要小于2次
        int num=check(str,s[i]); //获取最小重叠子串的长度
        if (num>0) 
        {
            vis[i]++;
            dfs(s[i],len+s[i].length()-num);
            vis[i]--;					//回溯
        }   
    }
}
int main()
{
	cin>>n;
    for (int i=0;i<=n;i++)
    {
        cin>>s[i];
    }
    //n为开始字符,长度默认为1
    dfs(s[n],1);    
    cout<<res;
	return 0;
}
....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
248.【华为OD机试】字符串间的最短路径问题(动态规划-Java&Python&C++&JS实现)
一键难忘的博客
01-22 1629
【华为OD机试】字符串间的最短路径问题(动态规划-Java&Python&C++&JS实现) 给定字符串,分别为字符串A与字符串B。例如A字符串为ABCABBA,B字符串为CBABAC可以得到下图m*n的二维数组,定义原点为(0, 0),终点为(m, n),水平与垂直的每一条边距离为1,映射成坐标系如下图。
最长最短单词c++题解
conniesarah的博客
07-05 1866
#include<iostream> #include<algorithm> #include<string> #include<cstdio> #include<cstring> #include<cmath> #include<stack> #include<queue> using namespace std; typedef long long ll; const int MOD = 10000007;
洛谷P1019 单词接龙
a free man
01-02 671
预处理+dfs
【洛谷】P1019 单词接龙C++/Java)
m0_51276753的博客
12-16 1806
洛谷P1019 单词接龙C++和Java种语言实现,附清晰思路。
P1019 单词接龙
Lily1221的博客
03-08 189
https://www.luogu.org/problemnew/show/P1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现次),在单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外...
P1019 [NOIP2000 提高组
lins
03-13 133
P1019 [NOIP2000 提高组] 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现次),在单词相连时,其重合部分合为一部分,例如 beast 和 astonish,如果接成一条龙则变为 beastonish,另外相邻的部分不能存在包含关系,例如 at 和 atide 间不能相连。 输入格式 输入的第一行为一个单独的整数 nn 表示单词数,以下 nn 行每行有
字符串拼接】p1019
m0_51506743的博客
03-04 177
P1019 NOIP2000 提高组单词接龙 题意:成语接龙,规定开头字母,字符串接龙找最长,每个单词最多使用次 解题思路:搜索 需要一个数组记录单词次数,一个单词最多次,visit数组 check函数,是在枚举接口长度的时候判断接口长度的可行性 add函数,简单的连接函数,注意引用 最重要的是深搜,dfs函数 #include <bits/stdc++.h> using namespace std; /* 肯定有不同的方案,但是还需要将重叠的部分去掉不计算 还需要记录次数 */ cons
js-leetcode题解字符串字符最短路径-题解.zip
最新发布
05-09
"js_leetcode题解字符串字符最短路径_题解"这份资源包含了用JavaScript解答LeetCode上的一道关于字符串字符最短路径的问题。它涉及了字符串处理、动态规划或回溯法等关键概念,对于想要提升JavaScript算法能力的...
单词接龙c++题解,请勿抄袭
XiaoQzheng的博客
08-12 1113
单词接龙c++题解 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现次),在单词相连时,其重合部分合为一部分,例如 beast 和 astonish,如果接成一条龙则变为 beastonish,另外相邻的部分不能存在包含关系,例如 at 和 atide 间不能相连。...
c++-c++编程基础之leetcode题解第28题找出字符串第一个匹配项的下标.zip
04-07
本资源"cpp-c++编程基础之leetcode题解第28题找出字符串第一个匹配项的下标.zip"显然是针对LeetCode上的第28题的解决方案,该题目的目标是在一个字符串中寻找第一个出现的目标子串的起始下标。 题目描述: 给定个...
P1019 [NOIP2000 提高组] 单词接龙c++
qq_62674859的博客
05-06 698
#include<bits/stdc++.h> using namespace std; int n; string arr[21]; int vis[21]; int maxn; void dfs(string a,int x) { maxn=max(maxn,x);//取最大值 for(int i=1; i<=n; i++) { int p=1; int la=a.length(); int lb=arr[i].length(); while(p<min(l.
P1019-单词接龙
红点雷龙XL
06-21 347
链接:https://www.luogu.org/problemnew/show/P1019思路:搜索,标记判断;需要一个判断单词的连接情况,包括连接字母的数目a,需要一个结构体,word变量中需要包括字母数和剩余使用数,需要搜索以及对开头单词的搜索;代码:#include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;algorith...
P1019 单词接龙(dfs,洛谷,java)
weixin_44685629的博客
02-08 360
洛谷链接:https://www.luogu.com.cn/problem/P1019 import java.util.Scanner; public class Main { static int n=0; //单词数 static char ch; //开头字母 static String[] str=new String[30]; //储存字符串 sta...
P1019 [NOIP2000 提高组] 单词接龙
obss666的博客
07-21 572
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现次),在单词相连时,其重合部分合为一部分,例如。可保证长度最长,只需先预处理出每个单词之间的可接龙时的最优方案,然后对所有情况跑dfs,取长度的最大值。,另外相邻的部分不能存在包含关系,例如。,如果接成一条龙则变为。...
洛谷 P1019 单词接龙
DoloresL的博客
04-30 1708
深搜 DFS解释在注释里都有 不多说什么了//P1019 单词接龙 //2017.4.26#include <iostream> #include <cstdio> using namespace std;const int MAXN = 24; int n, ans, book[MAXN], connect[MAXN][MAXN]; string word[MAXN]; char start;i
|Tyvj|贪心|P1019 配对
博客停更,请到"再见,CSDN"文章中找新博客地址
06-04 421
http://tyvj.cn/p/1019 贪心题目,a,b快排后从a的头开始加b的尾即为最大配对数 参考代码: #include #include int abs(int x) { if (x>=0) return x; else return 0-x; } int n; int a[10200], b[10200]; void qs(int* s, int l, int r)
翻转字符串中的单词顺序
"这篇文档是关于算法题解的,主要讨论如何翻转字符串中的单词,即将字符串中的单词顺序反转,同时保持单词内的字符顺序不变。题目要翻转后的字符串单词间仅用一个空格分隔,且不应包含额外的空格。题目给出了多...
257
原创
804
点赞
3110
收藏
364
粉丝
关注
私信
写文章

热门文章

  • A星寻路算法详解(C++实现 完整代码+图片演示 ) 16268
  • 贪心算法思想详解+示例代码 13743
  • 线性代数知识点总结(干货满满) 11945
  • c++Qt Creator调用 python 完整版 + 解决bug过程 6785
  • C++常见算法大全(自用) 6429

分类专栏

  • 高级数据结构 7篇
  • STL源码 4篇
  • 数学建模 19篇
  • MATLAB 19篇
  • 设计模式 7篇
  • OpenCV 7篇
  • QT学习 18篇
  • matplotlib 1篇
  • matploylib
  • hexo 1篇
  • python 6篇
  • labelme 1篇
  • 算法题解 31篇
  • 数学 2篇
  • codeforces 5篇
  • 前端 10篇
  • CSS 5篇
  • Windows 18篇
  • HTML 5篇
  • 动态规划 7篇
  • 图论 4篇
  • NumPy 2篇
  • Git 3篇
  • 蓝桥杯 1篇
  • leetcode与算法 17篇
  • leetcode刷题 3篇
  • 逆向 6篇
  • qt 2篇
  • mysql 7篇
  • rust 8篇
  • C++ 40篇
  • 汇编语言 10篇
  • 数据结构与算法 26篇
  • C语言 1篇
  • SDL教程 1篇

最新评论

  • 高级数据结构:线段树入门(c++实现 + 详解)

    小黑student: pushdown函数是查询该子节点时,会利用tag标记下放到子节点进行修改,同时清除该区间的标记

  • 高级数据结构:线段树入门(c++实现 + 详解)

    小黑student: 实际上开空间开的就算完全二叉树的大小2^{logn+1} - 1,甚至可以直接开4n,因为有些结点还没有到树高度时左右区间已经相等了,这个结点是没有孩子结点,但是开辟空间依然存在,比如对[0,5]建树,结点[2,2]就没有孩子结点

  • 权值线段树 详解+操作模板(c++)

    Tea》: 强大强大表情包

  • 高级数据结构:线段树入门(c++实现 + 详解)

    wjqnnn_: 查询函数中也push_down的作用是什么

  • A星寻路算法详解(C++实现 完整代码+图片演示 )

    山水有相逢8501: 图例里g值一看就不对,g值是当前路径的代价之和,图例里g值根本就没变表情包

最新文章

  • C++多线程编程(4):共享锁与互斥锁
  • C++多线程编程(3):接收线程处理函数的返回值
  • C++多线程编程(2):四种线程管理方法
2023年134篇
2022年124篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Yuleo_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值

玻璃钢生产厂家玻璃钢雕塑凳子厂家中意玻璃钢雕塑作品福建大型商场创意商业美陈品牌南京镜面玻璃钢雕塑价格安庆夏季商场美陈山西节日商场美陈个性化玻璃钢雕塑公司哪家好天水景区玻璃钢雕塑安装哈尔滨玻璃钢卡通人物雕塑玻璃钢红军雕塑原理商场美陈怎么搭建徐州玻璃钢雕塑定制价格玻璃钢花盆 鲁icp备案百色玻璃钢雕塑厂家沈阳玻璃钢雕塑优势江苏主题商场美陈有哪些玻璃钢丛台酒模型雕塑云浮玻璃钢雕塑批发商场动物美陈图片大全曲阳玻璃钢鹿雕塑厂家惠州园林玻璃钢雕塑制作买什么品牌玻璃钢雕塑山东公园玻璃钢雕塑销售厂家中山玻璃钢雕塑批发aaa订做玻璃钢雕塑盘龙区玻璃钢雕塑产品厂家汕尾商场美陈雕塑厂家江苏玻璃钢孔子雕塑韦陀菩萨玻璃钢雕塑摆件动物玻璃钢雕塑加盟香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化