字符串相关题目

目录

一:最长公共前缀

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;
    }
};
相关推荐
Vect__5 小时前
基于线程池从零实现TCP计算器网络服务
c++·网络协议·tcp/ip
草履虫建模8 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq11 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq11 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
学嵌入式的小杨同学11 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
爱吃rabbit的mq12 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
精彩极了吧12 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合
(❁´◡`❁)Jimmy(❁´◡`❁)12 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi13 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
CSDN_RTKLIB13 小时前
【四个场景测试】源文件编码UTF-8 BOM
c++