马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
前言
上篇我们先容了常用的字符串及其相干原理应用,本篇将联合具体标题,进一步深化对于字符串算法的把握运用。
第一章:最长公共前缀
1.1 标题链接:https://leetcode.cn/problems/longest-common-prefix/description/
1.2 标题分析:
- 现给出字符串数组,要求返回全部字符串的最长公共前缀
1.3 思绪解说:
解法⼀(两两⽐较):
我们可以先找出前两个的最⻓公共前缀,然后拿这个最⻓公共前缀依次与后⾯的字符串⽐较,如许就可以找出全部字符串的最⻓公共前缀。\
解法⼆(统⼀⽐较):
题⽬要求多个字符串的公共前缀,我们可以逐位⽐较这些字符串,哪⼀位出现了差异,就在哪⼀位截⽌。
1.4 代码实现:
两两比力代码示例:
- 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) {
- //所有字符串一起 逐个比较
- string ret=strs[0];
- for(int i=0;i<ret.size();i++)
- {
- char temp=strs[0][i];
- for(int j=1;j<strs.size();j++)
- {
-
- if(i==strs[j].size()||temp!=strs[j][i])
- {
- return ret.substr(0,i);
- }
- }
- }
- return ret;
-
- }
- };
复制代码 第二章:最长回文子串
2.1 标题链接:https://leetcode.cn/problems/longest-palindromic-substring/description/
2.2 标题分析:
标题要求找出字符串s中的最长回文子串,我们先来回顾一下什么是回文串。
回文串:即正反情势雷同的字符串,比方aba
2.3 思绪解说:
本题我们可以采取中心拓展算法
- 对于⼀个⼦串⽽⾔,如果它是回⽂串,而且⻓度⼤于 2,那么将它⾸尾的两个字⺟去除之后,它仍然是个回⽂串。云云如许去除,⼀直除到⻓度⼩于便是 2 时呢?⻓度为 1 的,⾃⾝与⾃⾝就构成回⽂;⽽⻓度为 2 的,就要判定这两个字符是否相当了。
- 从这个性子可以反推出来,从回⽂串的中⼼开始,往左读和往右读也是⼀样的。那么,是否可以摆列回⽂串的中⼼呢?
- 从中⼼向两边扩展,如果两边的字⺟雷同,我们就可以继承扩展;如果差异,我们就停⽌扩展。
- 如许只必要⼀层 for 循环,我们就可以完成先前两层 for 循环的⼯作量。
2.4 代码实现:
- class Solution {
- public:
- string longestPalindrome(string s) {
- int n=s.size();
- int left=0,right=0,len=0,begin=0;
- for(int i=0;i<n;i++)
- {
- //奇数次拓展
- 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.1 标题链接:https://leetcode.cn/problems/add-binary/description/
3.2 标题分析:
- 标题给出两个只包罗二进制数字的字符串,要求返回其按二进制运算规则相加的和
- 该和用字符串体现
3.3 思绪解说:
模拟⼗进制中我们列竖式盘算两个数之和的过程。但是这⾥是⼆进制的求和,我们不是逢⼗进⼀,⽽是逢⼆进⼀。
3.4 代码实现:
- class Solution {
- public:
- string addBinary(string a, string b) {
- int cur1=a.size()-1,cur2=b.size()-1;
- string ret="";//返回的字符串
- int 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;
-
- }
- };
复制代码 第四章:字符串乘法
4.1 标题链接:https://leetcode.cn/problems/multiply-strings/description/
4.2 标题分析:
- 给定两个以字符串情势体现的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也体现为字符串情势。
- 观察字符串长度范围,起首清除正常乘法,由于其值巨细远超long long所能体现的范围
4.3 思绪解说:
团体思绪就是模拟我们⼩学列竖式盘算两个数相乘的过程。但是为了我们誊写代码的⽅便性,我们选择⼀种优化版本的,就是在盘算两数相乘的时间,先不思量进位,比及全部结果盘算完毕之后,再去思量进位。如下图:
4.4 代码实现:
- class Solution {
- public:
- string multiply(string num1, string num2) {
- int m=num1.size(),n=num2.size();
- string ret="";
- int len=m+n-1;
- reverse(num1.begin(),num1.end());
- reverse(num2.begin(),num2.end());//先逆序两个字符串
- //不进位的乘法
- vector<int> temp(len);
- for(int i=0;i<m;i++)
- {
- for(int j=0;j<n;j++)
- {
- temp[i+j]+=(num1[i]-'0')*(num2[j]-'0');//此处注意是+=
- }
- }
- //处理进位
- int t=0,cur=0;
- while(cur<len||t)
- {
- if(cur<len)
- {
- t+=temp[cur++];
- }
- ret+=t%10+'0';
- t/=10;
- }
- //处理前导0
- while(ret.size()>1&&ret.back()=='0')
- {
- ret.pop_back();
- }
- reverse(ret.begin(),ret.end());
- return ret;
-
- }
- };
复制代码 尾声:字里行间的永恒智慧
字符串算法,犹如笔墨的邪术,将字符编织成信息的纽带。从暴力匹配到前缀树,从压缩算法到加密技能,它展示了算法的艺术与科学的联合。在将来的路程中,字符串算法将继承誊写信息期间的传奇,为人类探索未知的语言和数据天下提供智慧的钥匙。
本篇关于字符串算法的先容就暂告段落啦,渴望能对各人的学习产生资助,接待各位佬前来支持斧正!!!
|