目录
1.最长公共前缀
2.最长回文串
3.二进制求和
4.字符串相乘
1.最长公共前缀
. - 力扣(LeetCode)
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string ret;
int cur = 0;
while(1)
{
if(strs[0].size() == cur)return ret;
char tmp = strs[0][cur];
for(int i = 0; i < strs.size();i++)
{
if(strs[i].size() == cur)return ret;
if(strs[i][cur] != tmp)return ret;
}
ret += tmp;
cur++;
}
}
};
2.最长回文串
. - 力扣(LeetCode)
class Solution {
public:
string longestPalindrome(string s) {
int begin = 0;
int len = 0;
for(int i = 0; i < s.size(); i++)
{
int left = i;
int right = i;
while(left >=0 && right < s.size() && 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 < s.size() && s[left] == s[right])
{
left--;
right++;
}
if(right - left - 1 > len)
{
begin = left + 1;
len = right - left - 1;
}
}
return s.substr(begin,len);
}
};
3.二进制求和
. - 力扣(LeetCode)
class Solution {
public:
string addBinary(string a, string b) {
int sizea = a.size() - 1;
int sizeb = b.size() - 1;
int n = 0;
string ret;
int up = 0;
while (n <= sizea || n <= sizeb)
{
int sa = 0;
int sb = 0;
if (n <= sizea)
{
sa = a[sizea - n] - '0';
}
if (n <= sizeb)
{
sb = b[sizeb - n] - '0';
}
int Add = sa + sb + up;
up = 0;
if (Add < 2)
{
ret += Add + '0';
}
else
{
ret += Add + '0' - 2;
up = 1;
}
Add = 0;
n++;
}
if (up)ret += up + '0';
reverse(ret.begin(), ret.end());
return ret;
}
};
4.字符串相乘
. - 力扣(LeetCode)
class Solution {
public:
string multiply(string num1, string num2) {
string s1 = num1;
string s2 = num2;
int size1 = s1.size();
int size2 = s2.size();
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
vector<int> tmp(size1 + size2 - 1,0);
for(int i = 0; i < size1; i++)
{
for(int j = 0; j < size2; j++)
{
tmp[i+j] += (s1[i]-'0')*(s2[j]-'0');
}
}
string ret;
int up = 0;
for(int i = 0; i < tmp.size(); i++)
{
ret += (tmp[i]+up)%10 + '0';
up = (tmp[i]+up)/10;
}
if(up)ret += up + '0';
while(ret.back() == '0' && ret.size() > 1)
{
ret.pop_back();
}
reverse(ret.begin(),ret.end());
return ret;
}
};
这题我们使用无进位相加的方法。
先将字符串逆置,方便处理
我们将乘出来每一位的数值先保留,等到结束后再相加。
然后创建一个整型数组,我们所需数组长度为两个字符串长度之和-1,两个数不同位上相乘的结果可以存在这两个数下标之和对应的数组位置。
最后我们处理前导0,由于我们先逆置过了,因此字符串ret末尾的位置是高位,将0去除即可,最后逆置回来