字符串相关题目

目录

一:最长公共前缀

1.1题目

1.2算法原理

1.3代码

二:最长回文子串

2.1题目

2.2算法原理

2.3代码

三:二进制求和

3.1题目

3.2算法原理

3.3代码

四:字符串相乘

4.1题目

4.2算法原理

4.3代码


一:最长公共前缀

1.1题目

题目链接:https://leetcode.cn/problems/longest-common-prefix/description/


1.2算法原理


1.3代码

解法一:两两相互比较

cpp 复制代码
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) 
    {
        string ret = strs[0];
        for(int i = 1; i < strs.size();i++)
        {
            int length = 0;
            for(int j = 0; j < min(strs[i].size(),ret.size());j++)
            {
                if(strs[i][j] == ret[j]) length++;
                else break;
            }
            ret = string(strs[i].begin(),strs[i].begin()+length);
        } 

        return ret;
    }
};

解法二:统一比较

cpp 复制代码
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) 
    {
        string ret;
        int length = 0;
        for(int i = 0;i <= strs[0].size();i++)
        {
            char ch = strs[0][i];
            //判断每行的同一列是否相等
            for(int j= 1;j < strs.size();j++)
            {
                if(i == strs[j].size() || ch != strs[j][i]) 
                    return strs[0].substr(0,i);
            }
        }    
        return strs[0];
    }
};

二:最长回文子串

2.1题目

题目链接:https://leetcode.cn/problems/longest-palindromic-substring/description/


2.2算法原理


2.3代码

cpp 复制代码
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(len < right-left-1)
            {
                len = right-left-1;
                begin = left+1;
            }

            //偶数情况
            left = i,right = i+1;
            while(left >= 0 && right < n && s[left] == s[right])
            {
                left--;
                right++;
            }
           if(len < right-left-1)
            {
                len = right-left-1;
                begin = left+1;
            }
        }

        return s.substr(begin,len);
    }
};

三:二进制求和

3.1题目

题目链接:https://leetcode.cn/problems/add-binary/description/


3.2算法原理


3.3代码

cpp 复制代码
class Solution {
public:
    string addBinary(string a, string b) 
    {
        string ret;
        int l1 = a.size()-1,l2 = b.size()-1,next = 0;

        while(l1>= 0 || l2 >= 0 || next)
        {
            if(l1 >= 0) next += a[l1--] -'0';
            if(l2 >= 0) next += b[l2--] -'0';
            ret += next %2 +'0';
            next /= 2;
        }

        reverse(ret.begin(),ret.end());
        return ret;
    }
};

四:字符串相乘

4.1题目

题目链接:https://leetcode.cn/problems/multiply-strings/description/


4.2算法原理


4.3代码

cpp 复制代码
class Solution {
public:
    string multiply(string num1, string num2) 
    {
        //1.准备工作
        int m = num1.size(), n = num2.size();
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());
        vector<int> tmp(m+n-1);

        //2.无进位相乘再累加
        for(int i = 0; i < m;i++)
            for(int j = 0; j <n;j++)
                tmp[i+j] += (num1[i]-'0')*(num2[j]-'0');

        //3.处理进位
        int next = 0,cur = 0;
        string ret;
        while(next || cur < m+n-1)
        {
            if(cur< m+n-1) next += tmp[cur++];
            ret += next%10+'0';            
            next /= 10;
        }

        //4.处理前导0,此时是逆序前导0都在字符串尾部
        while(ret.size() > 1 && ret.back() == '0') ret.pop_back();

        reverse(ret.begin(),ret.end());

        return ret;
    }
};
相关推荐
IronMurphy34 分钟前
【算法四十三】279. 完全平方数
算法
墨染天姬40 分钟前
【AI】Hermes的GEPA算法
人工智能·算法
mount_myj42 分钟前
长长久久【C语言】
c语言
papership1 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826521 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u2 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
c++之路3 小时前
C++信号处理
开发语言·c++·信号处理
Legendary_0084 小时前
LDR6500:USB‑C DRP PD协议芯片技术详解与应用实践
c语言·开发语言
_深海凉_5 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
故事还在继续吗5 小时前
C++20关键特性
开发语言·c++·c++20