目录
一:最长公共前缀
1.1题目

题目链接:https://leetcode.cn/problems/longest-common-prefix/description/
1.2算法原理

1.3代码
解法一:两两相互比较
cpp
class Solution {
public:
string longestCommonPrefix(vector<string>& strs)
{
string ret = strs[0];
for(int i = 1; i < strs.size();i++)
{
int length = 0;
for(int j = 0; j < min(strs[i].size(),ret.size());j++)
{
if(strs[i][j] == ret[j]) length++;
else break;
}
ret = string(strs[i].begin(),strs[i].begin()+length);
}
return ret;
}
};
解法二:统一比较
cpp
class Solution {
public:
string longestCommonPrefix(vector<string>& strs)
{
string ret;
int length = 0;
for(int i = 0;i <= strs[0].size();i++)
{
char ch = strs[0][i];
//判断每行的同一列是否相等
for(int j= 1;j < strs.size();j++)
{
if(i == strs[j].size() || ch != strs[j][i])
return strs[0].substr(0,i);
}
}
return strs[0];
}
};
二:最长回文子串
2.1题目

题目链接:https://leetcode.cn/problems/longest-palindromic-substring/description/
2.2算法原理

2.3代码
cpp
class Solution {
public:
string longestPalindrome(string s)
{
//中心扩展算法
int begin = 0,len = 0;
//依次枚举所有的中点
int 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(len < right-left-1)
{
len = right-left-1;
begin = left+1;
}
//偶数情况
left = i,right = i+1;
while(left >= 0 && right < n && s[left] == s[right])
{
left--;
right++;
}
if(len < right-left-1)
{
len = right-left-1;
begin = left+1;
}
}
return s.substr(begin,len);
}
};
三:二进制求和
3.1题目

题目链接:https://leetcode.cn/problems/add-binary/description/
3.2算法原理

3.3代码
cpp
class Solution {
public:
string addBinary(string a, string b)
{
string ret;
int l1 = a.size()-1,l2 = b.size()-1,next = 0;
while(l1>= 0 || l2 >= 0 || next)
{
if(l1 >= 0) next += a[l1--] -'0';
if(l2 >= 0) next += b[l2--] -'0';
ret += next %2 +'0';
next /= 2;
}
reverse(ret.begin(),ret.end());
return ret;
}
};
四:字符串相乘
4.1题目

题目链接:https://leetcode.cn/problems/multiply-strings/description/
4.2算法原理

4.3代码
cpp
class Solution {
public:
string multiply(string num1, string num2)
{
//1.准备工作
int m = num1.size(), n = num2.size();
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
vector<int> tmp(m+n-1);
//2.无进位相乘再累加
for(int i = 0; i < m;i++)
for(int j = 0; j <n;j++)
tmp[i+j] += (num1[i]-'0')*(num2[j]-'0');
//3.处理进位
int next = 0,cur = 0;
string ret;
while(next || cur < m+n-1)
{
if(cur< m+n-1) next += tmp[cur++];
ret += next%10+'0';
next /= 10;
}
//4.处理前导0,此时是逆序前导0都在字符串尾部
while(ret.size() > 1 && ret.back() == '0') ret.pop_back();
reverse(ret.begin(),ret.end());
return ret;
}
};