字符串相关题目

目录

一:最长公共前缀

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;
    }
};
相关推荐
码客-ygluu10 小时前
一个通用游戏数据服务器
c++·架构
another heaven10 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude10 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司10 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
文丑颜不良啊11 小时前
LeetCode2821~2840题目解析
java·leetcode
YLCHUP12 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck12 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀13 小时前
背包DP(01背包+完全背包)
c++·算法
Zwawa14 小时前
让屏幕动起来:OLED动画效果,丝滑光标、帧动画和一只贪吃蛇
c语言·单片机·嵌入式
笑容掩饰我的失落14 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法