Processing math: 100%

leetcode题解-14-最长公共前缀

题目

官方解

1.水平扫描法

思路:

LCP(S1...Sn)=LCP(LCP(LCP(S1,S2),S3),...Sn)

2个字符串的最长前缀一般来说是每个字符串从头比较到尾,直到不相等为止。

但假如是n个字符串之间的比较的话,为了避免每次比较从头到尾进行,可以根据如上述公式,

  • 选取一个字符串A作为前缀,长度为k;
  • 若该字符串A与另一个B的前k字符串不同;

  • 则去掉一个字符串A中的末尾字符,形成新字符串A

  • 与串B比较直至满足前缀完全相等的情况;

  • 再将得到的最大公共前缀与串C,...,N比较,按上述循环进行,直至满足条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string s_0 = strs.size() ? strs[0] : "";

for (auto& str: strs)
{
// 前缀串s_0 与 串str的前s_0.size()部分不等,则前缀串s_0去掉末尾字符
while (str.substr(0, s_0.size()) != s_0)
{
s_0 = s_0.substr(0, s_0.size()-1);
if (s_0 == "") return "";
}
}

return s_0;
}
};

同时可以用s_0.pop_back(); 或者 s_0.erase(s_0.size() - 1);

替换掉 s_0 = s_0.substr(0, s_0.size() - 1)