第一句子大全,网罗天下好句子,好文章尽在本站!

Python算法:如何解决回文索引问题

时间:2014-06-29

例如,假设word是ab,并且S是abxaba,则返回0,3和4

友情提示:本文共有 1883 个字,阅读大概需要 4 分钟。

给定一个单词word和一个字符串S,找到S中的所有起始索引——word的回文。

例如,假设word是“ab”,并且S是“abxaba”,则返回0,3和4。

蛮力破解

对于这个问题野蛮的解决方案是遍历S中每个单词大小的窗口并检查它们是否是回文,如下所示:

from collections import Counterdef is_anagram(s1, s2):return Counter(s1) == Counter(s2)def anagram_indices(word, s): result = [] for i in range(len(s) - len(word) + 1): window = s[i:i + len(word)] if is_anagram(window, word): result.append(i) return result

这将花费O(|W| * |S|)时间。有没有更快的方法呢?

试试哈希

解决这个问题可以使用的一种方法是Rabin-Karp算法。基本思想是我们可以对目标word做一个基于频率的散列,并检查s下的任何窗口是否散列为相同的值。也就是说,散列将是每个字符和其频率的char * prime_num ** char_freq之和。如果word和窗口的散列匹配,则我们可以对两个字符串手动加上== 。因为预计冲突很少,所以时间将是O(S)。但是,解决这个问题有一个更简单的方法:

计数差异

请注意,沿着窗口移动意味着当实际只有一小部分更新的时候,重新计算整个窗口的频率计数。这种见解引导我们采取以下策略:

制作目标单词的频率字典当我们沿着字符串前进时,持续比较差异当字典为空时,窗口和单词匹配

我们通过增加窗口中的新字符并删除旧的字符来区分我们的频率字典。

class FrequencyDict:def __init__(self, s): self.d = {} for char in s: self.increment(char) def _create_if_not_exists(self, char): if char not in self.d: self.d[char] = 0 def _del_if_zero(self, char): if self.d[char] == 0: del self.d[char] def is_empty(self): return not self.d def decrement(self, char): self._create_if_not_exists(char) self.d[char] -= 1 self._del_if_zero(char) def increment(self, char): self._create_if_not_exists(char) self.d[char] += 1 self._del_if_zero(char)def anagram_indices(word, s): result = [] freq = FrequencyDict(word) for char in s[:len(word)]: freq.decrement(char) if freq.is_empty(): result.append(0) for i in range(len(word), len(s)): start_char, end_char = s[i - len(word)], s[i] freq.increment(start_char) freq.decrement(end_char) if freq.is_empty(): beginning_index = i - len(word) + 1 result.append(beginning_index) return result

这应该在O(S)时间运行。

欢迎继续探索其他有趣的编程问题。

本文如果对你有帮助,请点赞收藏《Python算法:如何解决回文索引问题》,同时在此感谢原作者。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
NLP实战:利用Python理解 分析和生成文本|赠书

NLP实战:利用Python理解 分析和生成文本|赠书

...不需要标记Word2vec词汇表中的词。我们不需要告诉Word2vec算法玛丽·居里是一个科学家、伐木者是一个足球队、西雅图是一个城市、波特兰是俄勒冈州和缅因州的一个城市,也不需要告诉Word2vec足球是一项运动、一个团队是一群人...

2023-06-11 #经典句子

用Python语言模型和LSTM做一个Drake饶舌歌词生成器

用Python语言模型和LSTM做一个Drake饶舌歌词生成器

...词汇量可以无限大,我们其实有很多提高生成词汇性能的算法,比如词嵌入,不过关于这个问题可以再写一篇文章了。这篇文章主要关注字符级模型,因为它更易于实施和理解,也更容易转化为复杂的词汇级模型。数据预处理针...

2023-12-24 #经典句子

网络运维Python课程.第5讲——基本语法(4)列表

网络运维Python课程.第5讲——基本语法(4)列表

...type()我们看到这6个元素的数据类型都不一样,列表的索引号从0开始,即对应列表中的第一个元素。各元素的数据类型已经标出。补充说一下,列表本身也可以作为元素存在于另一个列表中,如上图中索引号为5的最后一个元...

2014-09-18 #经典句子

每日一书:《数据结构与算法:Python语言实现》PDF 中文超清版

每日一书:《数据结构与算法:Python语言实现》PDF 中文超清版

内容简介本书基于Python语言介绍了数据结构与算法的基本知识,主要内容包括抽象数据类型和Python面向对象程序设计、线性表、字符串、栈和队列、二叉树和树、集合、排序以及算法的基本知识。本书延续问题求解的思路,从解...

2011-12-29 #经典句子

慢步Python:输出word文档内每段前10个字 在编写中学习知识点

慢步Python:输出word文档内每段前10个字 在编写中学习知识点

...个“切片”概念。p.text[:9]和p.text[0:9]相同,0和9是列表的索引,0索引指向第一个元素,9索引指向第10个元素。但是[0:9]指向的内容,由索引0开始,但不会到达索引9,即第1到第9个元素,但不包括第10个元素。嗯,慢步这时候又发...

2020-05-24 #经典句子

SEO词汇表:您应该知道的180多个术语和定义

SEO词汇表:您应该知道的180多个术语和定义

...务,可监控网络中与特定搜索查询匹配的内容更改。谷歌算法:当用户执行搜索时,Google用来对匹配结果进行排名的一组规则。谷歌分析:Google提供的免费服务,用于跟踪和监控网站流量。谷歌自动完成:输入搜索时Google给出的...

2008-10-09 #经典句子

Python的8种文本处理工具合集!Python入门

Python的8种文本处理工具合集!Python入门

...件,其功能包含三种分词模式,精确模式、全模式、搜索索引模式,支持繁体分词,支持自定义词典等。2、NLTK:一个构建Python程序以使用人类语言数据的领先平台,被称为使用Python进行教学和计算机语言学工作的绝佳工具,以...

2023-08-16 #经典句子

何索引数以十亿计的文本向量?

何索引数以十亿计的文本向量?

...小于到 QR 中向量的角距离.这被称为最近邻问题,有很多算法可以快速解决低维空间的最近邻问题。另一方面,使用词嵌入,我们通常使用高维向量(100-1000 维)。在这种情况下,精确的方法会崩溃。在高维空间中,没有快速获...

2023-01-22 #经典句子