37.(字符串)
有 n 个长为 m+1 的字符串,
如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,
问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。

分析:如果出现循环,则返回错误 这句不懂 我采用了绝对不会产生环的方法来做。

具体做法是先给每个字符串建一个vector 存入每个字符串后面可以匹配的字符串序号

然后遍历所有的搭配情况,找到最长的。

我的遍历代码很丑... 可谓又臭又长..... 深深的自我鄙视。

/*
37.(字符串)
有 n 个长为 m+1 的字符串,
如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,
问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
start time = 18:27
end time =
*/#include <iostream>
#include <vector>
#include <string>
using namespace std;//判断两个字符串能否拼接 0表示不能 2表示s1在前 1表示s2在前
int contact(string s1, string s2, int m)
{if(s1.substr(0, m) == s2.substr(s2.length() - m, m))return 1;else if(s2.substr(0, m) == s1.substr(s1.length() - m, m))return 2;elsereturn 0;
}void getMax0(vector<int> now, vector<vector<int>> can_compare, vector<int> &max)
{ bool isfind = false;int last = now.back();vector<int>::iterator it;for(it = can_compare.at(last).begin(); it < can_compare.at(last).end(); it++){bool isHave = false;vector<int>::iterator it2;for(it2 = now.begin(); it2 < now.end(); it2++){if((*it) == (*it2)){isHave = true;break;}}if(isHave == false){isfind = true;now.push_back(*it);getMax0(now, can_compare, max);now.pop_back();}}if(isfind == false){if(now.size() > max.size()){max = now;}}
}
vector<int> getMax(vector<vector<int>> can_compare)
{vector<int> contact;vector<int> max;vector<int> now;vector<vector<int>>::iterator it;for(int i = 0; i < can_compare.size(); i++){now.push_back(i);getMax0(now, can_compare, max);now.clear();}return max;
}//返回可能的最大长度
string maxLength(vector<string> S, int m)
{//找到每个字符串在前时有哪些其他字符串可以与其匹配vector<vector<int>> can_compare;vector<string>::iterator it;for(it = S.begin(); it < S.end(); it++){vector<int> can_member;vector<string>::iterator it2;int n = 0;for(it2 = S.begin(); it2 < S.end(); it2++){if(it != it2){if(contact(*it, *it2, m) == 2){can_member.push_back(n);}}n++;}can_compare.push_back(can_member);}vector<int> maxStringMember = getMax(can_compare);vector<int>::iterator it3;string ans = S.at(maxStringMember.at(0));for(it3 = maxStringMember.begin() + 1; it3 < maxStringMember.end(); it3++){string after = S.at(*it3);ans.append(after.substr(after.length() - 1, 1));}cout << "the max length is "<< ans.length() << endl;cout << "the string is " << ans << endl;return ans;
}int main()
{vector<string> S;string s1 = "abd";S.push_back(s1);string s2 = "bcd";S.push_back(s2);string s3 = "cde";S.push_back(s3);string s4 = "def";S.push_back(s4);string ans = maxLength(S, 2);return 0;
}

在网上看答案,发现这是一道图的题。可以通过floyd求最大路径来解决。

从网上找了一份代码,验证了可以使用。

代码中D[v][w] 是顶点v到顶点w的最大路径

p[v][w][u]是顶点v到顶点w最大路径上第u个顶点的序号。

INFINITY 顶点间无边时的值,是个负数

算法原理是,如果发现v 、w顶点中插入顶点u距离变大,则更新最大路径和最大距离。

代码如下:http://blog.csdn.net/cxllyg/article/details/7606599

#include <iostream>
#include <string>
using namespace std;#define INFINITY -10000
#define MAX_VERTEX_NUM 20 typedef struct MGraph{string vexs[MAX_VERTEX_NUM];//顶点信息,这里就是要处理的字符串,每个字符串看做一个顶点int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵,符合条件的两个字符串之间有边int vexnum, arcnum;//顶点数就是字符串的个数
}MGraph;void CreateDG(MGraph &G)//构造有向图
{int i, j;int m;cout<<"请输入要处理的字符串个数:";cin>>G.vexnum;cout<<"请输入这"<<G.vexnum<<"个字符串:";for(i=0; i<G.vexnum; i++)cin>>G.vexs[i];cout<<"请输入m:";cin>>m;for(i=0; i<G.vexnum; i++)for(j=0; j<G.vexnum; j++){if(G.vexs[i].substr(G.vexs[i].size()-m,m)==G.vexs[j].substr(0,m))//根据前后m个字符是否匹配确定两字符串之间是否有边G.arcs[i][j]=1;elseG.arcs[i][j]=INFINITY;}
}//利用弗洛伊德算法求各顶点间的最长路径,p保存路径,D保存各顶点间的最长路径,如果出现循环,函数返回false,反之返回true
bool Largeset_FLOYD(MGraph G, int p[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM], int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM])
{int v, w, u;int i, j;for(v=0; v<G.vexnum; v++)for(w=0; w<G.vexnum; w++){D[v][w]=G.arcs[v][w];for(u=0; u<G.vexnum; u++)p[v][w][u]=-1;if(D[v][w]>INFINITY){p[v][w][0]=v;p[v][w][1]=w;}}for(u=0; u<G.vexnum; u++)for(v=0; v<G.vexnum; v++)for(w=0; w<G.vexnum; w++){if(D[v][u]>INFINITY && D[u][w]>INFINITY && D[v][u]+D[u][w]>D[v][w] )//改进的弗洛伊德算法,求最长路径
                {D[v][w]=D[v][u]+D[u][w];//更新p,以便打印路径for(i=0; i<G.vexnum; i++){if(p[v][u][i]!=-1)p[v][w][i]=p[v][u][i];elsebreak;}for(j=1; j<G.vexnum; j++){if(p[u][w][j]!=-1)p[v][w][i++]=p[u][w][j];elsebreak;}}}//判断是否有循环for(v=0; v<G.vexnum; v++)if(D[v][v]!=INFINITY)return false;return true;
}void main()
{int i, j;int posx, posy;MGraph g;CreateDG(g);int p[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM];int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];bool flag=true;flag=Largeset_FLOYD(g, p, D);/*    for(i=0; i<g.vexnum; i++){for(j=0; j<g.vexnum; j++)cout<<D[i][j]<<" ";cout<<endl;}*/if(flag){cout<<"最大长度为:";int max=-10000;for(i=0; i<g.vexnum; i++)for(j=0; j<g.vexnum; j++){if(D[i][j]>max){max=D[i][j];posx=i;posy=j;}}cout<<max<<endl;cout<<"字符串链为:";for(i=0; i<g.vexnum; i++)//打印字符串链
        {if(p[posx][posy][i]!=-1)cout<<g.vexs[p[posx][posy][i]]<<" ";}cout<<endl;}elsecout<<"错误:出现循环"<<endl;system("pause");}

转载于:https://www.cnblogs.com/dplearning/p/3985086.html

【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配......相关推荐

  1. 【编程题 动态规划】最长公共子序列(详细注释 易懂)

    题目描述: 题目链接:最长公共子序列__牛客网 来源:牛客网 我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列.子串中的字符不一定在原字符串中连续. 例如字符串&q ...

  2. PTA 基础编程题目集 7-17 爬动的蠕虫 C语言

    PTA 基础编程题目集 7-17 爬动的蠕虫 C语言 一条蠕虫长1寸,在一口深为N寸的井的底部.已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬.在休息的过程中,蠕虫又下滑了D寸.就这样 ...

  3. 最长回文子串_【每日编程142期】最长回文子串II

    每日编程中遇到任何疑问.意见.建议请公众号留言或直接撩Q474356284(备注每日编程) 今日问题: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1 ...

  4. (PTA)基础编程题目集

    目录 函数题 1.简单输出整数 2.多项式求值 3.简单求和 4.求自定类型元素的平均 5.求自定类型元素的最大值 6.求单链表结点的阶乘和 7.统计某类完全平方数 8.简单阶乘计算 9.统计个位数字 ...

  5. 【基础编程题目集编程题及其答案】

    python江湖 7-1 厘米换算英尺英寸~15 题解: 7-2 然后是几点~15 题解: 7-3 逆序的三位数~10 题解: BCD解密~10 题解: 7-5 表格输出~5 题解: 7-6 混合类型 ...

  6. 基础编程题目集 编程题部分

    文章目录 7-1 厘米换算英尺英寸 (15分) 7-2 然后是几点 (15分) 7-3 逆序的三位数 (10分) 7-4 BCD解密 (10分) 7-5 表格输出 (5分) 7-6 混合类型数据格式化 ...

  7. 基础编程题目集(15 分题)

    基础编程题目集(15 分题) 7-1 厘米换算英尺英寸 (15 分) 如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048.现在,如果用户输入的是 ...

  8. HHTC_学校集训编程题目(13)(组队赛_3)

    HHTC_学校集训编程题目(13)(组队赛_3) C - Wandering Robot G - Circle B - 迷宫寻宝 D - 给力的移动 E - 谁还不是个宝宝 K - Teamwork ...

  9. 编程题目分类(剪辑)

    1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代 ...

最新文章

  1. [排序算法] 选择排序(2种)
  2. AppDelegate 处理iOS应用的生命周期事件
  3. 网络流24题1 飞行员配对方案问题
  4. java zip压缩_压缩工具
  5. Python项目实践:国家财政数据趋势演算
  6. 【10天基于STM32F401RET6智能锁项目实战第4天】外部中断的按键实现语音控制
  7. 论文赏析【EMNLP19】多粒度自注意力机制(MG-SA)
  8. python3语法学习第五天--函数(1)
  9. 自己动手写操作系统 - Hello DTOS
  10. ad10搜索快捷键_ad快捷键有哪些 ad快捷键汇总
  11. profinet远程IO总线模块IP67防护等级的优势
  12. 操作系统的目标和作用
  13. 苹果与深圳唯冠的未了之战
  14. contour()函数的理解
  15. python中的魔法方法__new___Python魔法方法会调用new方法吗?
  16. 将小图标转换成字体图标代码
  17. l7sa008b故障代码_美国凯利冷机故障码表
  18. AFN(上传、下载)
  19. 【设计模式】一:六大基本原则详解
  20. 软件测试(黑盒测试技术)+实验报告

热门文章

  1. python 删除set指定值_Python操作三大数据库 Redis
  2. Java笔记-SM3(国密3)和SM4(国密4)的使用
  3. Android逆向笔记-使用Android Studio调试Smali代码(方式一)
  4. CORS跨域限制以及预请求验证(C++ Qt框架实现)
  5. java 判断请求为 ajax请求_请问如何判断一个请求是不是ajax请求?
  6. 用计算机计算汉坦,河北省Ⅱ型汉坦病毒流行特征及与细胞自噬相互作用研究
  7. 天津工业大学c语言题库,天津工业大学it1创新2届c语言期末复习.ppt
  8. php关闭gd库,详解php开启gd库的两种方法
  9. java cxf 工具_利用CXF工具开发WebService接口
  10. python怎么读取石墨表格_python – 使用AMQP和石墨9.9