• 字串的连接最长路径查找


    这道题是华为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;
    }
    

      

  • 相关阅读:
    3.31上午英语视频
    3.30上午
    leetcode 38
    leetcode 36
    leetcode 28
    leetcode 27
    leetcode 26
    leetcode 24
    leetcode 21
    leetcode 20
  • 原文地址:https://www.cnblogs.com/hardsoftware/p/6269111.html
Copyright © 2020-2023  润新知