有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接

504 篇文章 0 订阅

转自: http://www.cnblogs.com/tractorman/p/4065544.html


算法中的三重循环


第三重的意思是

假设现在要求  1, 3  两个节点可拼接的最大距离


先看 :  1:0    1:1   1:2   1:3   1:4  

              0:3   1:3    2:3   3:3   4:3


竖着匹配, 如果 1和0之间可以拼接,3和0之间可以拼接,就可以算出1和三之间通过0进行拼接的拼接距离, 如此类推,比较这5对,可以计算出1和3两个节点最大的拼接距离


题目要求:

  有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接。

  问这n个字符串最多可以连成一个多长的字符串,如果出现死循环,则返回错误。

题目分析:

  1.每个字符串都是长为m+1的字符串,两个字符串匹配后长度应该为1+m+1=m+2;

  2.用图的思想来解。如果某两个顶点匹配,则在图中的该两点连线,当遍历完所有点之后,判断该图是否有环,没有就求该图的最长路径;

  3.求图的最长路径与求最短路径类似,可以参考Floyd最短路径算法;

代码实现:

代码链接:http://blog.csdn.net/cxh342968816/article/details/6637006

复制代码
#include<iostream>
#include<string>
using namespace std;

#define length 14

bool Isconnect(string str1,string str2)
{
    if(str1.size()!=str2.size())
        return false;
    int m=str1.size();
    for(int i=0;i<m-1;i++)
    {
        if(str1[i+1]!=str2[i])
            return false;
    }
    return true;
}

void Maxstring(string str[])
{
    int G[length][length]={0};
    for(int i=0;i<length;i++)
        for(int j=0;j<length;j++)
            if(Isconnect(str[i],str[j]))
                G[i][j]=1;
    for(int i=0;i<length;i++)
    {
        for(int j=0;j<length;j++)
        {
            for(int k=0;k<length;k++)
            {
                if(G[i][k]!=0&&G[k][j]!=0)
                {
                    int dis=G[i][k]+G[k][j];
                    if(dis>G[i][j])
                        G[i][j]=dis;
                }

            }
        }
    }
    for(int i=0;i<length;i++)
    {
        if(G[i][i]>1)
        {
            cout<<"circle is deteted"<<endl;
            return;
        }
    }
    int max=0;
    for(int i=0;i<length;i++)
    {
        for(int j=0;j<length;j++)
        {
            if(G[i][j]>max)
                max=G[i][j];

        }
    }
    cout<<"Max length is "<<max+str[0].size()<<endl;

}



int main()
{
    string str[length]={
        "abcd",
        "bcde",
        "cdea",
        "deab",
        "eaba",
        "abab",
        "deac",
        "cdei",
        "bcdf",
        "cdfi",
        "dfic",
        "cdfk",
        "bcdg",
//        "babc"};//用这个替换下面一行,就会形成环
        "babf"};
        Maxstring(str);

}
复制代码

 

很多时候不是我们做不好,而是没有竭尽全力......



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值