1.最长公共前缀
思路:
解法一:
两两比较求出公共前缀
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);
}
};
解法二:
统一比较
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.最长回文子串
思路:
中心扩展算法
注意细节问题,回文串长度可能是奇数和偶数,分情况讨论
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);
}
};
3.二进制求和
思路:
模拟小学加法列竖式计算
class Solution {
public:
string addBinary(string a, string b) {
int cur1 = a.size() - 1, cur2 = b.size() - 1, t = 0;
string ret;
while(cur1 >= 0 || cur2 >= 0 || t != 0)
{
if(cur1 >= 0) t += a[cur1--] - '0';
if(cur2 >= 0) t += b[cur2--] - '0';
ret += t % 2 + '0';
t /= 2;
}
reverse(ret.begin(), ret.end());
return ret;
}
};
4.字符串相乘
思路:
模拟列竖式乘法
这里用的是无进位相乘后相加,然后处理进位后清除前导零
另一种比这个麻烦,细节较多,推荐这种方法
class Solution {
public:
string multiply(string nums1, string nums2) {
// 进行预处理
int m = nums1.size(), n = nums2.size();
reverse(nums1.begin(), nums1.end());
reverse(nums2.begin(), nums2.end());
vector<int> tmp(m + n - 1); // 999 * 999 --> m + n - 1
//无进位相乘然后相加
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
tmp[i + j] += (nums1[i] - '0') * (nums2[j] - '0');
//处理进位
int cur = 0, t = 0;
string ret;
while(cur < m + n - 1 || t != 0)
{
if(cur < m + n - 1) t += tmp[cur++];
ret += t % 10 + '0';
t /= 10;
}
//处理前导零
while(ret.size() > 1 && ret.back() == '0') ret.pop_back();
reverse(ret.begin(), ret.end());
return ret;
}
};