Manacher 算法分析与实现

Keywords: #algorithm

最近刚做完 Leetcode 上的 Longest Palindromic Substring,用的是 Manacher 算法(国内俗称马拉车算法)。之前高中打 OI 时也做过同样的题目,不过当时是作为动态规划的例题来介绍的;再加上后来我没认真学 Manacher 算法,所以直到这几天才算是初步学习了该算法。

Manacher 算法是一种能以 O(n) 的时间复杂度找出一个字符串里的所有回文子串的算法。相比于暴力搜索(O(n^3))与动态规划/中心扩展(O(n^2)),它的时间复杂度要低得多。这篇博客就简单记录一下我对 Manacher 算法的理解。

思考自我:工作之外的生活

Keywords: #prose

在现代人的语境中,工作与生活几乎是彻底对立、无法共存的词汇 。我是基本上支持这个观点的,尽管情绪没有那么强烈 —— 或许因为我还是学生 。但今天我想讨论 —— 与其说是讨论,不如说反思更为贴切 —— 的就是现代人的工作性质所导致的工作与生活在语义上的分离,以及我们该如何编排工作之外的生活 。

Flask + Celery + Redis 实现异步处理任务队列

Keywords: #backend #python

最近正在尝试编写网站,其中一个功能是帮助用户从某个 URL 抓取信息 —— 也就是爬虫 。但众所周知,爬虫程序由于 I/O 阻塞通常会消耗较长的时间,无法第一时间对用户请求作出响应 。因此我们会希望让爬虫任务在后台处理,等到执行成功/失败后再将结果返回给用户;而任务队列就作为 Web 后端接口与爬虫处理程序之间的一个中介,负责传输任务的具体内容和执行结果 。这篇博客不会具体阐述 Flask Web 开发或 Python 爬虫的相关技术,而将重点聚焦于使用流行的开源异步任务处理框架 Celery 实现一个任务队列的基本功能 。

(我才不是出于咕咕咕的负罪感连更博客的)

呓语:2018 / 2019

Keywords: #prose

突然想起一些往事 。

想起往日的烟火 。那时我站在窗前给她打电话,窗外漫天都是新年的烟火 。那些烟花耀眼而短暂,透过冬夜寒冷的空气映射在窗玻璃上,晃出摇曳不定的影子 。一朵又一朵,烟花绽放继而消失,透过窗玻璃传达着陌生的喜悦;我的心脏也在有力地跳动,鲜红而热烈,期待着未曾发生的将来 。电话铃响了似乎有一个世纪那么长,接通后却只说了短短一句新年好,紧接着便是长久的沉默 。窗外的烟火震耳欲聋,我听不清也记不清她说了些什么 。

基于 Vue.js 实现递归树形导航栏组件以及页面锚点同步滚动

Keywords: #frontend #vue

这篇博客的标题不是很直观 —— 事实上就是实现了类似百度百科(以及本博客 )的导航栏效果 。可以这样描述核心功能:

  • 首先,将正文内容按 H1 ~ H6 解析成递归的树形结构数据并映射到导航栏
  • 其次,在用户点击导航栏时将正文平滑滚动到相应锚点
  • 最后,当正文内容滚动时同步更新导航栏(高亮活动元素)

项目的全部源代码与效果图都在 GitHub 上,欢迎参观 。