- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定两个字符串 S 和 T,其中 T 是模式字符串。查找字符串 S 中是否存在任何模式字符串的加扰形式作为 SubString,如果存在则返回起始索引。
示例:
字符串 S: abcdef字符串 T:efd
字符串 S 有“def”,搜索字符串 T 的组合:“efd”。
我找到了一个运行时间为 O(m*n) 的解决方案。我正在研究一个线性时间解决方案,我曾经使用 HashMaps(静态的,为字符串 T 维护,另一个是前一个 HashMap 的动态副本,用于检查 T 的当前子字符串)。我会开始检查失败的下一个字符。但在最坏的情况下,这在 O(m*n) 中运行。我想获得一些指示以使其在 O(m+n) 时间内工作。任何帮助将不胜感激。
最佳答案
首先,我想知道字符串 S
的边界长度 (m)
和图案T
长度 (n)
.
存在一个通用的想法,但基于它的解决方案的复杂性取决于模式长度。复杂性从 O(m)
变化至 O(m*n^2)
对于 length<=100
的短模式和 O(n)
对于长模式。
Fundamental theorem of arithmetic指出每个整数都可以唯一地表示为素数的乘积。
想法 - 我猜,你的字母表是英文字母。所以,字母表的大小是 26。让我们用第一个素数替换第一个字母,用第二个素数替换第二个字母,依此类推。我的意思是以下替换:
a->2
b->3
c->5
d->7
e->11 等等。
让我们将与某个字符串的字母对应的素数的乘积表示为 prime product(string)
.例如,primeProduct(z)
将是 101
作为101
是第 26 个素数,primeProduct(abc)
将是 2*3*5=30
, primeProduct(cba)
也将是5*3*2=30
.
为什么我们选择素数?如果我们更换 a ->2; b ->3,c->4,我们无法破译示例 4 - 是“c”还是“aa”。
短模式案例的解决方案:对于字符串 S,我们应该计算所有前缀的线性时间素积。我的意思是我们必须创建数组 A 使得 A[0] = primeProduct(S[0])
, A[1] = primeProduct(S[0]S[1])
, A[N] = primeProduct(S)
.示例实现:
A[0] = getPrime(S[0]);
for(int i=1;i<S.length;i++)
A[i]=A[i-1]*getPrime(S[i]);
搜索模式 T。计算 primeProduct(T)。对于所有 'windows'
在与 pattern 具有相同长度的 S 中,将它的 primeProduct 与 primeProduct(pattern) 进行比较。如果 currentWindow 等于模式或 currentWindow 是模式的困惑形式(anagramm),primeProducts 将相同。
重要提示!我们已经为 快速计算 primeProduct 准备了数组 A,用于S 的任何子串。 primeProduct of(S[i],S[i+1],...S[j])
= getPrime(S[i])*...*getPrime(S[j])
= A[j]/A[i-1]
;
复杂度:如果模式长度<=9,即使是'zzzzzzzzz'
是101^9<=MAX_LONG_INT
;所有计算都符合标准 long 类型,复杂度为 O(N)+O(M),其中 N 用于计算模式的 primeProduct,M 遍历 S
中的所有窗口 .如果 length<=100 你必须增加 mul/div long numbers 的复杂性,这就是复杂性变为 O(m*n^2)
的原因. 101^length 的长度是 O(N) 如此长的数字的 mul/div 是 O(N^2)
对于长度>=1000 的长模式,最好存储一些 HashMap (质数,度数)。前缀数组将成为散列映射数组和 A[j]/A[i-1]
trick 会变成 differenceBetween(A[j] and A[i-1] hashmaps key sets).
关于string - 在线性时间内匹配字符串的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17959729/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!