字符串相关题目

目录

一:最长公共前缀

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;
    }
};
相关推荐
NAGNIP1 小时前
万字长文!回归模型最全讲解!
算法·面试
知乎的哥廷根数学学派2 小时前
面向可信机械故障诊断的自适应置信度惩罚深度校准算法(Pytorch)
人工智能·pytorch·python·深度学习·算法·机器学习·矩阵
txinyu的博客2 小时前
解析业务层的key冲突问题
开发语言·c++·分布式
码不停蹄Zzz2 小时前
C语言第1章
c语言·开发语言
666HZ6663 小时前
数据结构2.0 线性表
c语言·数据结构·算法
SmartRadio3 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
实心儿儿4 小时前
Linux —— 基础开发工具5
linux·运维·算法
charlie1145141914 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式
济6176 小时前
嵌入式C语言(第二期)
c语言
清木铎6 小时前
leetcode_day4_筑基期_《绝境求生》
算法