字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(上)

字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(上)

文章目录

在这里插入图片描述

引言:一场字符与算法的交响曲

在计算机科学的浩瀚星空中,字符串是最细腻、最富诗意的结构之一。它承载了语言的重量,将符号化作信息的桥梁。而解构字符串的算法,如同一场字符与逻辑的交响曲,为我们揭开语言背后隐藏的规则与模式。

字符串算法就像诗人用笔墨书写情感,它用代码去理解文字,用数据去探索意义。在本文中,我们将以代码为引,带领你走进字符串算法的世界,探寻其中的奇妙。

第一章:从匹配到理解——字符串的基础算法

1.1 暴力搜索:逐字逐句的匠人精神

暴力匹配是字符串算法的起点,它逐字逐句地尝试匹配每一个子串,就像一位匠人,用最朴实的方式完成任务。

代码示例:暴力搜索子字符串

#include<iostream>#include<string>usingnamespace std;// 暴力字符串匹配算法intbruteForceSearch(const string& text,const string& pattern){int n = text.size();int m = pattern.size();// 从文本中逐位置匹配子字符串for(int i =0; i <= n - m; i++){int j =0;while(j < m && text[i + j]== pattern[j]){ j++;}if(j == m){return i;// 匹配成功,返回起始位置}}return-1;// 未找到}intmain(){ string text ="to be or not to be"; string pattern ="not";int index =bruteForceSearch(text, pattern);if(index !=-1){ cout <<"Pattern found at index: "<< index << endl;}else{ cout <<"Pattern not found."<< endl;}return0;}

输出:

Pattern found at index: 9

代码分析:

  • 算法原理:从文本的每个起始位置开始逐字符匹配子字符串,直到匹配成功或文本结束。
  • 时间复杂度:O(n⋅m),适用于小规模的文本匹配任务。
  • 文学意境:暴力匹配就像逐页翻阅一本书,直到找到心仪的章节。

1.2 KMP算法:文字间的优雅跳跃

Knuth-Morris-Pratt(KMP)算法是暴力搜索的进阶,通过预处理子字符串模式来避免重复匹配,让搜索过程变得更加高效。这种算法如同一位熟稔书法的大家,精确地跳跃到关键字符处,完成高效匹配。

代码示例:KMP字符串匹配

#include<iostream>#include<vector>#include<string>usingnamespace std;// 构造部分匹配表(LPS表) vector<int>computeLPSArray(const string& pattern){int m = pattern.size(); vector<int>lps(m,0);int len =0;// 当前最长前缀后缀长度int i =1;while(i < m){if(pattern[i]== pattern[len]){ lps[i++]=++len;}else{if(len !=0){ len = lps[len -1];}else{ lps[i++]=0;}}}return lps;}// KMP算法实现intKMPSearch(const string& text,const string& pattern){ vector<int> lps =computeLPSArray(pattern);int n = text.size();int m = pattern.size();int i =0;// 文本索引int j =0;// 模式索引while(i < n){if(text[i]== pattern[j]){ i++; j++;}if(j == m){return i - j;// 匹配成功,返回起始位置}elseif(i < n && text[i]!= pattern[j]){if(j !=0){ j = lps[j -1];}else{ i++;}}}return-1;// 未找到}intmain(){ string text ="abcdabcabcdabcde"; string pattern ="abcdabcde";int index =KMPSearch(text, pattern);if(index !=-1){ cout <<"Pattern found at index: "<< index << endl;}else{ cout <<"Pattern not found."<< endl;}return0;}

输出:

Pattern found at index: 8

代码分析:

  • 算法核心:KMP通过构造部分匹配表(LPS表)来记录模式的重复信息,减少了多余的匹配。
  • 时间复杂度:O(n+m),比暴力法更高效。
  • 文学意境:KMP算法如同解读诗歌的韵律,利用每一句的重复节奏找到整首诗的完整结构。

第二章:字符串的变形之术——编辑与构造

2.1 编辑距离:从一句到另一句的最短路径
编辑距离(Edit Distance)是一种用来衡量两个字符串相似度的方法。它以最少的操作(插入、删除、替换)将一个字符串转变为另一个字符串,就像修改诗句,让其更符合韵脚。

代码示例:动态规划求解编辑距离

#include<iostream>#include<vector>#include<string>usingnamespace std;// 计算编辑距离inteditDistance(const string& str1,const string& str2){int m = str1.size();int n = str2.size(); vector<vector<int>>dp(m +1,vector<int>(n +1,0));// 初始化边界条件for(int i =0; i <= m; i++) dp[i][0]= i;for(int j =0; j <= n; j++) dp[0][j]= j;// 动态规划填表for(int i =1; i <= m; i++){for(int j =1; j <= n; j++){if(str1[i -1]== str2[j -1]){ dp[i][j]= dp[i -1][j -1];// 字符相等,无需操作}else{ dp[i][j]=1+min({dp[i -1][j], dp[i][j -1], dp[i -1][j -1]});}}}return dp[m][n];}intmain(){ string str1 ="kitten"; string str2 ="sitting"; cout <<"Edit distance between \""<< str1 <<"\" and \""<< str2 <<"\": "<<editDistance(str1, str2)<< endl;return0;}

输出:

Edit distance between “kitten” and “sitting”: 3

代码分析:

  • 算法核心:通过动态规划记录每个子问题的最优解,最终求得最小操作数。
  • 时间复杂度:O(m⋅n),适合处理短文本的相似度计算。
  • 文学意境:编辑距离是诗人润色诗句时的考量,将每一处修辞调整得更契合情感。

第三章:应用与未来——字符串算法的诗意未来

3.1 文本搜索与自动补全

Trie树或前缀树,是一种高效的字符串存储结构,可用于实现实时搜索引擎和自动补全。

3.2 基因序列分析

编辑距离被广泛应用于基因比对,帮助科学家分析 DNA 的相似性,解开生命密码。

3.3 自然语言处理

KMP 和动态规划在机器翻译、拼写检查中扮演重要角色,让机器更懂得人类的语言。

3.4 数据压缩

哈夫曼编码和字符串匹配算法用于优化存储和传输,让文字的重量变得更加轻盈。

尾声:字里乾坤,算法的诗意流转

字符串算法就像文学的笔墨,将字符串联成句子,将句子构筑成意义。从暴力匹配到KMP,从编辑距离到 Trie
树,它们展示了逻辑与美学的结合。在信息的时代,这些算法不仅是一种工具,更是一首探索数据和语言的诗篇。未来,字符串算法将在更广阔的领域中书写新的传奇。

本篇关于字符串算法的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!

在这里插入图片描述

Read more

【强化学习】Soft Actor-Critic (SAC) 算法

【强化学习】Soft Actor-Critic (SAC) 算法

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:        【强化学习】- 【单智能体强化学习】(13)---《Soft Actor-Critic (SAC) 算法》 Soft Actor-Critic (SAC) 算法 目录 一、Soft Actor-Critic (SAC) 算法详解 二、SAC 背景与核心思想 1. 强化学习的挑战 2. 最大熵强化学习的目标 三、SAC 算法流程 初始化: 每一回合循环: 四、公式推导 1. Q 值更新 2. 值函数更新 3.

By Ne0inhk
【leetcode】队列 + 宽搜,树形结构层序遍历的基础与变化

【leetcode】队列 + 宽搜,树形结构层序遍历的基础与变化

前言 🌟🌟本期讲解关于力扣的几篇题解的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-ZEEKLOG博客 🔥 你的点赞就是小编不断更新的最大动力                                        🎆那么废话不多说直接开整吧~~   目录 📚️1.N叉树的层序遍历 🚀1.1题目描述 🚀1.2思路讲解 🚀1.3题目代码 📚️2.二叉树锯齿形遍历 🚀2.1题目描述 🚀2.2思路讲解 🚀2.3题目代码 📚️3.二叉树最大宽度 🚀3.1题目描述 🚀3.2思路讲解 🚀3.3题目代码 📚️4.总结 📚️1.N叉树的层序遍历 🚀1.1题目描述 给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。 树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。 如下图所示: 输入:

By Ne0inhk
磨损均衡算法介绍

磨损均衡算法介绍

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:硬件知识,本专栏为记录项目中用到的知识点,以及一些硬件常识总结 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 磨损均衡算法介绍 有关磨损均衡技术的相关资料下载地址:磨损均衡技术相关论文 核心问题:为什么需要磨损均衡? 要理解磨损均衡,首先要明白Flash存储器(包括NAND Flash和NOR Flash)的物理限制: 1. 有限的擦写次数: Flash存储单元在经历一定次数的擦除操作后,会因物理损耗而失效。这个次数就是耐久度。 * SLC NAND: ~10万次 * MLC NAND: ~3千 - 1万次 * TLC NAND: ~500 - 1.5千次 * QLC NAND: ~100

By Ne0inhk
《算法题讲解指南:递归,搜索与回溯算法--递归》--1.汉诺塔,2.合并两个有序链表

《算法题讲解指南:递归,搜索与回溯算法--递归》--1.汉诺塔,2.合并两个有序链表

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》 《算法题讲解指南》--优选算法 《算法题讲解指南》--递归、搜索与回溯算法 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 前言 递归,搜索与回溯算法前置知识(极其重要) 1.汉诺塔 题目链接: 题目描述: 题目示例: 解法(递归): 算法思路: C++算法代码: 算法总结及流程解析: 2.合并两个有序链表 题目链接: 题目描述: 题目示例: 解法(递归): 算法思路: C++算法代码: 算法总结及流程解析: 结束语 前言       从本篇文章开始我们就要讲解很多人一开始学习就感到非常不解以及迷茫,不清楚代码到底怎么执行的算法:递归、

By Ne0inhk