> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。> 目标:熟练掌握字符串算法。
> 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。
> 专栏选自:刷题训练营
> 望小伙伴们点赞👍收藏✨加关注哟💕💕
🌟前言分析
最早博主续写了牛客网130道题,这块的刷题是让同学们快速进入C语言,而我们学习c++已经有一段时间了,知识储备已经足够了但缺少了实战,面对这块短板博主续写刷题训练,针对性学习,把相似的题目归类,系统的刷题,而我们刷题的官网可以参考:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网
⭐知识讲解
基本思想:
- 一般都是定义指针来遍历字符串
- 利用容器
- 采用模拟
🌙topic-->1
题目链接:1. 最长公共前缀 - 力扣(LeetCode)
题目分析:
编写一个函数来查找字符串数组中的最长公共前缀。
算法原理:
- 解法一:两个比较
图解:
- 解法二:统一比较
图解:
代码演示:
// 方法一:
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];
}
};
🌙topic-->2
题目链接:2. - 力扣(LeetCode)
题目分析:
给你一个字符串 s
,找到 s
中最长的回文子串(如果字符串向前和向后读都相同)
算法原理:
- 解法:中心扩展算法
图解:
代码演示:
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);
}
};
🌙topic-->3
题目链接:3. - 力扣(LeetCode)
题目分析:
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
算法原理:
- 解法:两个比较
图解:
代码演示:
class Solution {
public:
string addBinary(string a, string b) {
string ret;
int cur1 = a.size() - 1, cur2 = b.size() - 1, t = 0;
while (cur1 >= 0 || cur2 >= 0 || t) {
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;
}
};
🌙topic-->4
题目链接:4. - 力扣(LeetCode)
题目分析:
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
算法原理:
- 解法:两个比较
图解:
代码演示:
class Solution {
public:
string multiply(string n1, string n2) {
// 解法:⽆进位相乘后相加,然后处理进位
int m = n1.size(), n = n2.size();
reverse(n1.begin(), n1.end());
reverse(n2.begin(), n2.end());
vector<int> tmp(m + n - 1);
// 1. ⽆进位相乘后相加
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
tmp[i + j] += (n1[i] - '0') * (n2[j] - '0');
// 2. 处理进位
int cur = 0, t = 0;
string ret;
while (cur < m + n - 1 || t) {
if (cur < m + n - 1)
t += tmp[cur++];
ret += t % 10 + '0';
t /= 10;
}
// 3. 处理前导零
while (ret.size() > 1 && ret.back() == '0')
ret.pop_back();
reverse(ret.begin(), ret.end());
return ret;
}
};
🌟结束语
今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。