欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 算法笔记(八)——字符串

算法笔记(八)——字符串

2024/10/25 16:24:36 来源:https://blog.csdn.net/m0_74317866/article/details/142702461  浏览:    关键词:算法笔记(八)——字符串

文章目录

  • 最长公共前缀
  • 最长回文子串
  • 二进制求和
  • 字符串相乘

最长公共前缀

题目:最长公共前缀

在这里插入图片描述
思路

  • 两两比较,将每两个的子串和未比较的字符串相比较;
    在这里插入图片描述

C++代码

class Solution 
{
public:string Common(string& s1, string& s2){int i = 0;while(i < min(s1.size(), s2.size()) && s1[i] == s2[i])i++;return s1.substr(0, i);}string longestCommonPrefix(vector<string>& strs) {// 两两比较string ret = strs[0];for(int i = 1; i < strs.size(); i++)ret = Common(ret, strs[i]);return ret;}
};

最长回文子串

题目:最长回文子串

在这里插入图片描述
思路

  • 中心扩散:计算以每一个字母为中心向左右两边扩散的奇数和偶数的回文串最大长度和该回文串的起始位置

C++代码

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(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);}
};

二进制求和

题目:二进制求和

在这里插入图片描述
思路

  • 从字符串右边开始累加进位拼接字符串,计算完之后记得翻转字符串

C++代码

class Solution 
{
public:string addBinary(string a, string b) {   string res;int cur1 = a.size() - 1;int cur2 = b.size() - 1;int t = 0; // 进位while(cur1 >= 0 || cur2 >= 0 || t){if(cur1 >= 0) t += a[cur1--] - '0';if(cur2 >= 0) t += b[cur2--] - '0';   res += t % 2 + '0';t /= 2;}reverse(res.begin(), res.end());return res;}
};

字符串相乘

题目:字符串相乘

在这里插入图片描述
思路

  • 计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后再去进位

C++代码

class Solution 
{
public:string multiply(string num1, string num2) {int n = num1.size(), m = num2.size();// 反转两个字符串reverse(num1.begin(), num1.end());   reverse(num2.begin(), num2.end());   // 存放每一位相乘的结果vector<int> tmp(n + m - 1);// 无进位相乘for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){tmp[i + j] += (num1[i] - '0') * (num2[j] - '0');}}// 处理进位int cur = 0, t = 0;string ret;while(cur < n + m - 1 || t != 0){if(cur < n + m + 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;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com