上篇文章:力扣C++算法:哈希表(存在重复元素|存在重复元素II|字母异位词分组)
目录
1.最长公共前缀
https://leetcode.cn/problems/longest-common-prefix/description/
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。

算法原理
解法一:两两比较
如下图所示,各个字符串依次两两比较,最终返回相同的部分,边界条件处理:当比较时遇到空字符,则比较结束。

cpp
class Solution
{
public:
string longestCommonPrefix(vector<string>& strs)
{
string ret = strs[0];
for(int i = 1; i < strs.size(); i++)
{
ret = findCommon(ret, strs[i]);
}
return ret;
}
string findCommon(string& s1, string& s2)
{
int i = 0;
while(i < min(s1.size(), s2.size()) && s1[i] == s2[i]) i++;
return s1.substr(0, i);
}
};
解法二:统一比较
以strs[0]为基准,将所有字符串进行统一比较,如下图所示:

cpp
class Solution
{
public:
string longestCommonPrefix(vector<string>& strs)
{
for(int i = 0; i < strs[0].size(); i++)
{
char tmp = strs[0][i];
for(int j = 1; j < strs.size(); j++)
{
if(i == strs[j].size() || tmp != strs[j][i])
return strs[0].substr(0, i);
}
}
return strs[0];
}
};
2.最长回文子串
https://leetcode.cn/problems/longest-palindromic-substring/description/
给你一个字符串 s,找到 s 中最长的 回文 子串。

算法原理
解法:中心扩展算法
暴力枚举策略:固定i,依次移动j,进行一一对比。
我们在此基础上做出优化

定义一个中点,将其指针向前和向后进行移动,依次对比字符

并且考虑奇数长度与偶数长度之间的不同

cpp
class Solution {
public:
string longestPalindrome(string s) {
int begin = 0, len = 0, n = s.size();
for(int i = 0; i < n; i++) // 依次枚举中点
{
// 对奇数长度扩展
int left = i, right = i;
while(left >= 0 && right < n && s[left] == s[right])
{
left--;
right++;
}
if(right - left - 1 > len)
{
begin = left + 1;
len = right - left - 1;
}
// 对偶数长度扩展
left = i, right = i + 1;
while(left >= 0 && right < n && s[left] == s[right])
{
left--;
right++;
}
if(right - left - 1 > len)
{
begin = left + 1;
len = right - left - 1;
}
}
return s.substr(begin, len);
}
};
本章完。