字串的连接最长路径查找

这道题是华为oj上的,非常low,题目中有些隐含条件未有描述清楚,比如输入都是4个字符的字符串,只有3个字符重合时才能相连接。

如下代码中被注释掉的部分是为了迎合oj评价系统而改动,非我本意。

代码使用DFS解决,使用floyd求解最长路径是不行的,原理上不能讲通。

描述

给定n个字串,其中一个字串的后m个字符,是下一个字串的开始。

找出所有字串中的能连接起来的最长路径。

知识点 查找,排序
运行时间限制 10M
内存限制 128
输入

 

输出

 

样例输入 ABCC ABCD BCCE BCDE CCEF BCCE CCEG CEGF
样例输出 ABCCEGF
#include<iostream>
#include<string>
#include<vector>

#define INF 100000000

using namespace std;

int getlength(string a, string b)
{
    int numa = a.length();
    int numb = b.length();

    int nummin = numa > numb ? numb : numa;

    int i;
   // for(i=nummin; i>0; i--)
   // {
        i = 3;
        bool flag = true;
        for(int j=0; j<i; j++)
        {
            if( a[numa-i+j] != b[j] )
                flag = false;
        }
        //if(flag) break;
    //}
    if(flag==false)
        return 0;
    else
        return 1;
        //return numb-i;
}

//sovle
void dfs(int start, int num, int &now, int &max, vector<int> &path, vector<int> &maxpath, int **graph, int *flag)
{
    bool hasone = false;
    for(int i=0; i<num; i++)
    {
        if(graph[start][i] > 0 && flag[i] == 1)
        {
            hasone = true;
            flag[i] = 0;
            now += graph[start][i];
            path.push_back(i);

            dfs(i,num, now, max, path, maxpath, graph, flag);

            flag[i] = 1;
            now -= graph[start][i];
            path.pop_back();
        }
    }

    if(hasone==false)
    {
        if(now > max)
        {
            max = now;
            maxpath.clear();
            for(unsigned int i=0; i<path.size(); i++)
            {
                maxpath.push_back(path[i]);
            }
        }
    }
}

void printit(vector<int> &path, vector<string> &vstr, int **graph)
{
    int i = 0;
    for(unsigned int j=0; j<path.size(); i=path[j], j++)
    {
        //cout<<path[j]<<','<<graph[i][path[j]]<<endl;
        int leng = vstr[path[j]-1].length();
        for(int k=leng-graph[i][path[j]]; k<leng; k++)
        {
            cout<<vstr[path[j]-1][k];
        }
    }

}

int main()
{
    vector<string> vstr;
    string tmp;

    while(cin>>tmp)
    {
        vstr.push_back(tmp);
    }

    int **graph;
    int num = vstr.size()+1;

    graph = new int* [num];
    for(int i=0; i<num; i++)
    {
        graph[i] = new int [num];
    }


    //init graph
    for(int i=1; i<num; i++)
    {
        graph[0][i] = vstr[i-1].length();
    }
    for(int i=0; i<num; i++)
    {
        graph[i][0] = 0;
    }
    for(int i=1; i<num; i++)
    {
        for(int j=1; j<num; j++)
        {
            graph[i][j] = getlength(vstr[i-1], vstr[j-1]);
            if(i==j)
            {
                graph[i][j] = 0;
            }
        }
    }

//show
/*
    for(int i=0; i<num; i++)
    {
        for(int j=0; j<num; j++)
        {
            cout<<graph[i][j]<<' ';
        }
        cout<<endl;
    }
*/

// init flag
    int *flag;
    flag = new int [num];
    for(int i=0; i<num; i++)
    {
        flag[i] = 1;
    }

    int now = 0;
    int max = 0;
    vector<int> path;
    vector<int> maxpath;
//dfs
    dfs(0, num, now ,max, path, maxpath, graph, flag);



//output
    //cout<<max<<endl;
    printit(maxpath, vstr, graph);

//free space
    delete [] flag;
    for(int i=0; i<num; i++)
    {
        delete [] graph[i];
    }
    delete [] graph;


    return 0;
}

  

posted @ 2017-01-10 13:56  Hardsoftware  阅读(713)  评论(0编辑  收藏  举报