网站建设审核怎么建一个视频网站做推广
web/
2025/9/27 7:23:28/
文章来源:
网站建设审核,怎么建一个视频网站做推广,电商商城网站开发框架,wordpress算数验证Leetcode 2851. String Transformation 0. 吐槽1. 算法思路 1. 整体思路2. 字符串匹配优化 2. 代码实现 题目链接#xff1a;2851. String Transformation
0. 吐槽
这道题多少有点坑爹#xff0c;题目本身挺有意思的#xff0c;是一道数组题目#xff0c;其实用数学方法…Leetcode 2851. String Transformation 0. 吐槽1. 算法思路 1. 整体思路2. 字符串匹配优化 2. 代码实现 题目链接2851. String Transformation
0. 吐槽
这道题多少有点坑爹题目本身挺有意思的是一道数组题目其实用数学方法直接可以写出结果的数学表达式因此做的时候成就感非常强。
但是坑爹的来了谁会想到这道题最终卡人的是数组匹配算法真心晕菜
举个不太恰当的例子就像是你去复原一个魔方你想了n久终于想到了魔方的复原方法然后到了考场上面面试官给了你一块木头和一把锯子让你先做个魔方然后再复原还限时2h……
就尼玛坑爹啊
不过万幸总算是搞定了顺道也优化了一下字符串的匹配算法虽然非我所愿但多少也有点成就感吧……
1. 算法思路
1. 整体思路
这一题整体思路上可以视为一道数组题目。
显然的对于一个长度为 n n n的字符串s我们经过 k k k此操作之后可能的操作方式总数有 ( n − 1 ) k (n-1)^{k} (n−1)k种。
我们假设第 k k k次操作之后字符串s恰好变为t的操作方式总数为 a k a_k ak那么显然我们有如下递推公式 a k a k − 1 × ( m − 1 ) ( ( n − 1 ) k − 1 − a k − 1 ) × m m ⋅ ( n − 1 ) k − 1 − a k − 1 \begin{aligned} a_k a_{k-1} \times (m-1) ((n-1)^{k-1} - a_{k-1}) \times m \\ m \cdot (n-1)^{k-1} - a_{k-1} \end{aligned} akak−1×(m−1)((n−1)k−1−ak−1)×mm⋅(n−1)k−1−ak−1
其中 m m m表示s的所有循环字符串至多经过一次操作之后得到的字符串当中t的个数亦即s可以通过 m m m种旋转方式直接变为t。
此时我们由上述递推公式不难迭代写出 a k m ⋅ ( n − 1 ) k − 1 − a k − 1 a k − 1 m ⋅ ( n − 1 ) k − 2 − a k − 2 ⋯ a 1 m ⋅ ( n − 1 ) 0 − a 0 \begin{aligned} a_k m \cdot (n-1)^{k-1} - a_{k-1} \\ a_{k-1} m \cdot (n-1)^{k-2} - a_{k-2} \\ \cdots \\ a_1 m \cdot (n-1)^{0} - a_{0} \end{aligned} akak−1⋯a1m⋅(n−1)k−1−ak−1m⋅(n−1)k−2−ak−2m⋅(n−1)0−a0
我们分别带入之后即可得到 a k a_k ak的表达式如下 a k ( − 1 ) k a 0 m ∑ i 0 k − 1 ( − 1 ) k − 1 − i ⋅ ( n − 1 ) i ( − 1 ) k a 0 m ⋅ ( n − 1 ) k − ( − 1 ) k n \begin{aligned} a_{k} (-1)^{k} a_0 m \sum\limits_{i0}^{k-1} (-1)^{k-1-i} \cdot (n-1)^i \\ (-1)^{k} a_0 m \cdot \frac{(n-1)^k - (-1)^k}{n} \end{aligned} ak(−1)ka0mi0∑k−1(−1)k−1−i⋅(n−1)i(−1)ka0m⋅n(n−1)k−(−1)k
因此事实上这道题我们可以通过 n , m , k n,m,k n,m,k的值直接算出我们的最终答案。
剩下的问题就是 n , m n,m n,m的求解了其中 n n n是显然的剩下的就是 m m m的求解了本来其实就是将s再拼接一份然后看一下新组成的这个字符串当中t一共出现的次数就行了用伪代码表示就是
n len(s)
ns s s[:-1]
m len([i for i in range(n) if ns[i:in] t])结果没想到这里居然一直超时最后这道题大部分的时候居然都集中在了解决这个问题上面也是醉了……
下面我们就来看一下我们具体对于这个问题的优化。
2. 字符串匹配优化
如前所述这里事实上我们可以将问题抽象为如下问题 已知两个字符串s和t问s当中t一共出现过多少次。 因此这里其实就是一个字符串匹配的问题不过我们可以对其进行一下优化
如果s当中的某一段已经和t匹配上了假设起始坐标为i此时我们就可以通过t本身的特性找到t当中最接近头部的某个位置idx满足t[idx:] t[:n-idx]此时我们可以直接跳转到这个位置然后比较子串t[n-idx:]与s[in:inidx]是否一致即可判断新的这个子串s[iidx:iidxn]是否等于t而无需判断中间的位置以及完整地判断这两个子串是否相同。
此时问题就简化到了如何求得t当中最接近头部的某个位置idx满足t[idx:] t[:n-idx]而这个可以通过z-algorithm来进行快速实现关于这部分的内容我们之前已经写过了一个博客经典算法Z算法z algorithm对其进行过整理了这里我们就不再展开赘述了。
2. 代码实现
综上我们就可以给出我们最终的python代码实现如下
def z_algorithm(s):n len(s)z [0 for _ in range(n)]l, r -1, -1for i in range(1, n):if i r:l, r i, iwhile r n and s[r-l] s[r]:r 1z[i] r-lr - 1else:k i - lif z[k] r - i 1:z[i] z[k]else:l iwhile r n and s[r-l] s[r]:r 1z[i] r-lr - 1z[0] nreturn zdef find_all(s, t):l, n len(s), len(t)prefix z_algorithm(t)nxt, m n, 0for i in range(1, n):if i prefix[i] n:nxt im prefix[i]breakidx 0cnt 0while idx l:idx s.find(t, idx)if idx -1:breakcnt 1if nxt n:while idxn l and t[m:] s[idxn:idxnnxt]:idx idxnxtcnt 1idx 1return cntclass Solution:def numberOfWays(self, s: str, t: str, k: int) - int:MOD 10**97n len(s)m find_all(ss[:-1], t)f0 0 if s ! t else 1fk f0 * pow(-1, k) m * pow(n, -1, MOD) * (pow(n-1, k, MOD) - pow(-1, k))return fk % MOD提交代码评测得到耗时801ms占用内存41.1MB。
值得一提的是截至23.9.10晚间当前这个执行效率远远高于其他python提交的算法执行效率其他实现当中最快的执行时间为3167ms多少也是让我感觉挺有成就感的……
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81228.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!