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;
    }
};
结果如下:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值