我觉得人要知足啊,不要做每到题的时候都想着有没有最优化的办法,这样没什么不好,但是这样也让你很伤脑经,
我个人觉得还是要由浅入深,先想出简单办法,再去想优化的办法。这个题的解法真的不难,但是这个题目的意思却是
能让人思考好一会儿,我想了半天,是不是用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; } };
结果如下:
时间: 2024-10-15 12:34:43