跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

字符串模拟题精选:思维与实现解析

字符串模拟题考察逻辑构造与细节处理。解析四个典型题目:最长公共前缀采用两两比较或统一遍历;最长回文子串使用中心扩展算法处理奇偶情况;二进制求和模拟列竖式加法并处理进位;字符串相乘通过反转字符串模拟高精度乘法运算。重点在于边界条件判断、字符转换及进位逻辑的准确实现。

编程诗人发布于 2026/3/29更新于 2026/7/2935 浏览
字符串模拟题精选:思维与实现解析

字符串模拟题精选:思维与实现解析

在字符串算法题中,有一类题目看起来没有太多算法技巧,却经常让人'翻车'——那就是字符串模拟题。这类题型往往不依赖复杂的数据结构或高级算法,更多的是对逻辑构造能力、字符串操作细节以及边界处理的考察。

14. 最长公共前缀

题目来源:LeetCode 14. 最长公共前缀

算法思路

解法一:两两比较 通过两两比较的方式,不断循环寻找字符不相等的位置,利用 substr 接口进行字符串截取。这里,'最长公共前缀'的意思是根据木桶效应,取最短字符串的长度作为'最长公共前缀'的上限。

代码实现:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        // 解法一:两两结合
        string tmp = strs[0];
        for (int i = 1; i < strs.size(); i++) {
            tmp = findPrefix(tmp, strs[i]);
        }
        return tmp;
    }

    string findPrefix(string& s1, string& s2) {
        int i = 0;
        while (i < min(s1.size(), s2.size()) && s1[i] == s2[i]) i++;
        return s1.substr(0, i);
    }
};

解法二:统一比较 使用 char 类型变量记录字符串中的元素,通过循环逐个比较字符是否相等。考虑到'最长公共前缀'的上限,当某段完全相同的字符串长度等于当前遍历的字符串长度时,说明已经达到了公共前缀的上限,此时可以直接返回结果。

代码实现:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        // 解法二:统计比较
        for (int j = 0; j < strs[0].size(); j++) {
            char ch = strs[0][j];
            for (int i = 0; i < strs.size(); i++) {
                if (j == strs[i].size() || strs[i][j] != ch) return strs[0].substr(0, j);
            }
        }
        return strs[0];
    }
};

5. 最长回文子串

题目来源:LeetCode 5. 最长回文子串

算法思路

解法:中心扩展算法

  1. 固定一个中心点。
  2. 从中心开始,向两边扩展。

注意:需要同时考虑奇数长度和偶数长度的回文情况。扩展过程中,若遇到越界或不符合回文性质时,停止并返回。中心扩展算法特别适用于回文数的对称特性。

代码实现:

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 (right - left - 1 > len) {
                begin = left + 1;
                len = right - left - 1;
            }
            // 偶数扩张
            left = i, right = i + 1;
            while (left >= 0 && right < n && s[left] == s[right]) {
                left--;
                right++;
            }
            if (right - left - 1 > len) {
                begin = left + 1;
                len = right - left - 1;
            }
        }
        return s.substr(begin, len);
    }
};

67. 二进制求和

题目来源:LeetCode 67. 二进制求和

算法思路

解法:高精度模拟加减乘除 高精度算法模拟了列竖式计算过程,通常称为'二进制高精度加法算法',对于两个字符串的处理从低位开始。需要特别注意进位处理逻辑,并且要处理前导零的情况。判断条件为:当 cur >= 0 时,继续处理到最前的数据,若不需要加上原数据,默认加 0。

数字字符转换为整型时:数字字符 - '0' 即得到整型值。

最后,使用 reverse 进行翻转,以符合题目的要求。

代码实现:

class Solution {
public:
    string addBinary(string a, string b) {
        int cur1 = a.size() - 1, cur2 = b.size() - 1;
        int t = 0;
        string ret;
        while (cur1 >= 0 || cur2 >= 0 || t) {
            if (cur1 >= 0) t += a[cur1--] - '0';
            if (cur2 >= 0) t += b[cur2--] - '0';
            ret += t % 2 + '0';
            t /= 2;
        }
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

43. 字符串相乘

题目来源:LeetCode 43. 字符串相乘

算法思路

解法一:'模拟'小学的列竖式运算 解法二:无进位相乘然后相加,最后处理进位

关于此类高精度题目,推荐先将原始字符串进行反转,因为列竖式计算是从低位开始的。对于两个字符串,先反转它们,再将数字字符转换为整型,通过数组存储结果。我们创建的数组大小为 m + n - 1,其中 m 和 n 分别是两个字符串的长度。通过数学或绘图分析,可以发现这个刚好满足累加所需的存储空间。

这里使用无进位相乘然后相加,最后再处理进位。由于无论是先进行进位还是后进行进位,最终的结果是相同的,因此我们推荐先将结果存储下来,然后再进行进位处理,这样更为方便和简洁,避免了细节很多存在的问题。

算法步骤:

  1. 将输入的两个字符串反转,以便从低位开始进行处理。
  2. 对于两个字符串中的数字,通过下标相加,其两个数字结果正好对应数组中相应位置的值。在进行加法时,需使用 += 来累加结果。
  3. 在处理完所有操作后,可能会出现前导零的情况。最终需要使用 reverse 进行翻转,并去掉多余的前导零。可以通过以下代码来去除前导零:while (ret.size() > 1 && ret.back() == '0') ret.pop_back();

代码实现:

class Solution {
public:
    string multiply(string nums1, string nums2) {
        int n = nums1.size(), m = nums2.size();
        // 字符串反转
        reverse(nums1.begin(), nums1.end());
        reverse(nums2.begin(), nums2.end());
        vector<int> nums(m + n - 1);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                nums[i + j] += ((nums1[i] - '0') * (nums2[j] - '0'));
        
        // 进位处理
        string ret;
        int t = 0, cur = 0;
        while (cur < m + n - 1 || t) {
            if (cur < m + n - 1) t += nums[cur++];
            ret += t % 10 + '0';
            t /= 10;
        }
        
        // 处理前导零
        while (ret.size() > 1 && ret.back() == '0') ret.pop_back();
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

目录

  1. 字符串模拟题精选:思维与实现解析
  2. 14. 最长公共前缀
  3. 算法思路
  4. 5. 最长回文子串
  5. 算法思路
  6. 67. 二进制求和
  7. 算法思路
  8. 43. 字符串相乘
  9. 算法思路
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ STL 标准库算法详解
  • WebGIS 开发实战:坐标系转换原理与 JavaScript 实现
  • LeetCode 692. 前 K 个高频单词(Python 实现)
  • OpenCode 使用 GitHub Copilot 计费机制分析与优化方案
  • Python 核心基础:函数、列表与元组实战指南
  • MySQL 核心技术原理与实战指南
  • To B 业务中最易落地的 Agent 场景:DataAgent
  • PCL 点云处理算法汇总:滤波、配准与特征提取实战指南
  • ms-swift 框架大模型推理实践完全指南
  • Python 50 道核心面试题:从基础到高级实战解析
  • Swift Composable Architecture 大型 SwiftUI 应用架构实践
  • 利用 Prompt 技巧优化简历,提升 AI 筛选通过率
  • 网络安全入门:从基础到求职的实用路径
  • Pandas 数据清理实用技巧速查
  • 规范驱动编程:AI 工具 Kiro 前端验证及调整实测
  • AI 代码生成 Prompt 实战:从需求描述到完整函数
  • OpenCode 配置体系实战:AGENTS、权限、技能、MCP、记忆
  • 基于 SpringBoot 的宠物诊所管理系统设计与实现
  • Flutter for OpenHarmony 实战:通义万相 AIGC 联调与相册持久化
  • Qt for Android 嵌入 WebView 常见问题与解决方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online