字符串相关题目

目录

一:最长公共前缀

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;
    }
};
相关推荐
llz_1122 小时前
图(邻接表)-(DFS/BFS)-Dijkstra
算法·深度优先·dijkstra·宽度优先
派葛穆2 小时前
机器人-六轴机械臂的逆运动学
算法·机器学习·机器人
千里马-horse2 小时前
AsyncContext
开发语言·前端·javascript·c++·napi·asynccontext
宠..2 小时前
为单选按钮绑定事件
运维·服务器·开发语言·数据库·c++·qt·microsoft
那雨倾城2 小时前
用 YOLO Pose + Segmentation 在PiscCode构建“语义佛光”:一次实时视觉语义融合实验
图像处理·python·opencv·算法·yolo·计算机视觉·视觉检测
nnerddboy2 小时前
解决传统特征波段选择的局限性:1.对偶学习
学习·算法·机器学习
宠..2 小时前
对单选按钮分组
开发语言·数据库·c++·qt·安全·安全性测试
CoovallyAIHub2 小时前
自顶向下 or 自底向上?姿态估计技术是如何进化的?
深度学习·算法·计算机视觉
q_30238195562 小时前
14.7MB轻量模型!NVIDIA Jetson边缘设备解锁工厂设备故障预警新方案
人工智能·python·算法·ascend·算子开发