• LeetCode 14


    我认为人要知足啊,不要做每到题的时候都想着有没有最优化的办法,这样没什么不好,可是这样也让你非常伤脑经,

    我个人认为还是要由浅入深,先想出简单办法。再去想优化的办法。这个题的解法真的不难,可是这个题目的意思却是

    能让人思考好一会儿,我想了半天,是不是用strncmp一个一个的比較啊。有没有更好的办法呀,最后发现參数时string

    类,所以顿时有了思路。

    思路就是对照呗,可是我们得做点优化:

    (1)最长的公共前缀不会超过字符数组的最短的一个字符串的长度,所以我们找大最短的字符串,这样能够降低循环次数    

    (2)仅仅要全部的字符串的同样位置的字符不相等,那么就没有必要再比較下去了。

    终于的代码例如以下:

    class Solution {
    public:
        string longestCommonPrefix(vector<string>& strs) {
                //  最长公共前缀。就是从头開始找这个字符串数组里面有多少个公共的字符
                string ret;
                int numofstr = strs.size();
                if(numofstr == 0)
                {   
                    return ret;
                }
                if(numofstr == 1)
                {
                    return strs[0];
                }
                //最长公共前缀不可能超过字符串数组中最短的字符串的长度。所以有必要先找到这个最短的字符串
                int mpos = 0;
                for(int i=1; i<numofstr; ++i)
                {
                    if(strs[i].size() < strs[mpos].size())
                    {   mpos = i;   }
                }
                int maxlen = 0; //记录公共前缀的长度
                int msize = strs[mpos].size();
                bool flag = true; //用于标记么有出现公共字符,可直接退出,而不须要额外的对照
                for(int j=0; j<msize; j++)
                {
                    char tmp = strs[mpos][j];
                    flag = true;
                    for(int k=0; k < numofstr; ++k)
                    {
                        if(strs[k][j] != tmp)
                        {
                            flag = false;
                            break;
                        }
                    }
                    //假设中间出现不一致
                    if(!flag)
                    {
                        break;
                    }
                    //所有同样的话
                    ++maxlen;
                }
                
                for(int v=0; v<maxlen ;++v)
                {
                    ret.push_back(strs[mpos][v]);
                }
                
                return ret;
        }
    };
    结果例如以下:


  • 相关阅读:
    TranslateAnimation 运行动画后实际位置不正确问题
    Linux下如何编译并运行C程序
    row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
    C++软件开发常用辅助软件——gprof
    C++软件开发常用辅助软件——Cppcheck
    C++软件开发常用辅助软件——SCons
    C++软件开发常用辅助软件——Valgrind
    救援linux
    C/C++代码覆盖率生成
    排列的逆
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7262683.html
Copyright © 2020-2023  润新知