当前位置: 首页 > article >正文

字符串 (算法十一)

简介

没有固定题型,内容很杂,可以学习下string接口与相关操作

1.最长公共前缀

link:

解法一:两两比较

code

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        // 两两比较
        string ans = strs[0];
        for(int i = 1; i < strs.size(); i++)
        {
            ans = func(ans, strs[i]);
        }
        return ans;
    }

    string func(string& s1, string& s2)
    {
        for(int i = 0; ;i++)
        {
            if(i >= min(s1.size(), s2.size()) || s1[i]!=s2[i]) return {s1.begin(), s1.begin()+i};
        }
    }
};

解法二:统一比较

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        // string ans = "";
        int ans = 0;
        while(true)
        {
            for(auto& e:strs)
            {   if(e.empty()) return "";
                if(ans >= e.size() || e[ans] != strs[0][ans]) return {strs[0].begin(), strs[0].begin()+ans};
            }
            ans++;
        }
        return {strs[0].begin(), strs[0].begin()+ans};
    }
};

2.最长回文字串

link:5. 最长回文子串 - 力扣(LeetCode)

中心扩散法

code

class Solution {
public:
    string longestPalindrome(string s) {
        // 中心扩散
        int maxl = 1, bgn = 0;
        for(int i = 0; i < s.size(); i++)
        {
            // 奇数长度
            int left = i-1, right = i+1;
            while(left >= 0 && right <= s.size()-1 && s[left] == s[right])
            {
                left--;
                right++;
            }
            if(right - left - 1 > maxl)
            {
                maxl = right - left - 1;
                bgn = left+1;
            }
            // 偶数长度
            left = i;
            right = i+1;
            while(left >= 0 && right <= s.size() - 1 && s[left] == s[right])
            {
                left--;
                right++;
            }
            if(right - left - 1 > maxl)
            {
                maxl = right - left - 1;
                bgn = left + 1;
            }
        }
        return s.substr(bgn, maxl);
    }
};

3.二进制求和

link:67. 二进制求和 - 力扣(LeetCode)

思路

        模拟即可,高精度加法

code

class Solution {
public:
    string addBinary(string a, string b) {
        int p1 = a.size() - 1, p2 = b.size() - 1;
        string ans;
        for(int t = 0; t || p1 >= 0 || p2 >= 0; )
        {
            t += p1 >= 0 ? a[p1--] - '0' : 0;
            t += p2 >= 0 ? b[p2--] - '0' : 0;
            ans += t % 2 + '0';
            t /= 2;
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

4.字符串相乘

Link:43. 字符串相乘 - 力扣(LeetCode)

思路:

        高精度乘法

        无进位相乘然后相加,最后处理进位

code

class Solution {
public:
    string multiply(string num1, string num2) {
        vector<int> tmp(num1.size() + num2.size(), 0);
        reverse(num1.begin(), num1.end());
        reverse(num2.begin(), num2.end());
        for(int i = 0; i < num1.size(); i++)
        {
            for(int j = 0; j < num2.size(); j++)
            {
                tmp[i + j] += (num1[i] - '0') * (num2[j] - '0');
            }
        }
        // 进位
        for(int i = 0, t = 0; i < tmp.size(); i++)
        {
            t += tmp[i];
            tmp[i] = t % 10;
            t /= 10;
        }
        // 输出
        string ans = "";
        for(int i = 0; i < tmp.size(); i++) ans = string(1, tmp[i] + '0') + ans;
        for(auto it = ans.begin(); it != ans.end(); it++)// 去前导0
        {
            if(*it != '0') return string(it, ans.end());
        }
        return "0";
    }
};

http://www.kler.cn/a/502434.html

相关文章:

  • Genymotion配套VirtualBox所在地址
  • torch.einsum计算张量的外积
  • 【ARM】MDK如何将变量存储到指定内存地址
  • Redis持久化双雄
  • 3D滤波器处理遥感tif图像
  • 抖音矩阵是什么
  • 【8】深入理解 Go 语言中的协程-从基础到高级应用
  • django基于Python对西安市旅游景点的分析与研究
  • 探秘 JMeter (Interleave Controller)交错控制器:解锁性能测试的隐藏密码
  • Go语言之路————func
  • Golang笔记——语言基础知识
  • PyTorch 张量的分块处理介绍
  • 鸿蒙UI开发——带农历的日期滑动选择弹窗
  • 74 mysql having 的实现
  • 数据结构与算法之链表: LeetCode 234. 回文链表 (Ts版)
  • sql server 对 nvarchar 类型的列进行 SUM() 运算
  • Spring Boot 动态表操作服务实现
  • OS1.【Linux】大致介绍和环境搭建
  • Redis高危漏洞-GHSA-whxg-wx83-85p5:用户可能会使用特制的 Lua 脚本来触发堆栈缓冲区溢出
  • uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机上
  • 掌握 Ubuntu 终端 mv 与 rename 命令的高效重命名使用方法
  • STM32-笔记42-实时时钟项目
  • uniapp 抖音小程序 getUserProfile:fail must be invoked by user tap gesture
  • CMake学习笔记(1)
  • 开源免费的下载工具AB Download Manager
  • 中等难度——python实现电子宠物和截图工具