博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法67-----环绕字符串中唯一的子字符串【动态规划】
阅读量:6816 次
发布时间:2019-06-26

本文共 1289 字,大约阅读时间需要 4 分钟。

一、题目:

把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....". 

现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 sp 的不同的非空子串的数目。 

注意: p 仅由小写的英文字母组成,p 的大小可能超过 10000。

 

示例 1:

输入: "a"输出: 1解释: 字符串 S 中只有一个"a"子字符。

 

示例 2:

输入: "cac"输出: 2解释: 字符串 S 中的字符串“cac”只有两个子串“a”、“c”。.

 

示例 3:

输入: "zab"输出: 6解释: 在字符串 S 中有六个子串“z”、“a”、“b”、“za”、“ab”、“zab”。.

思路:动态规划:时间O(n),空间O(1)

http://www.cnblogs.com/grandyang/p/6143071.html

dp【i】表示以26个字母中第i个字母作为结尾的连续子串个数。dp[0] 表示以a为结尾的,dp[1]表示以b为结尾的……。

我们看abcd这个字符串,

以a为结尾的子字符串为a,dp[0] = 1

以b为结尾的子字符串为b,ab 。dp[1] = 2

以c为结尾的子字符串为c,bc,abc。dp[2] = 3

以d结尾的子字符串有abcd, bcd, cd, d,故 i = 3,dp[3] = 4。

结果为:1+2+3+4 = 10

题目可以转换为分别求出以每个字符(a-z为结束字符的最长连续字符串就行了,我们用一个数组res记录下来,最后在求出数组res的所有数字之和就是结果。

代码:

def findSubstringInWraproundString(p):    if not p:        return 0    n = len(p)    m = 0    dp = [0] * 26    for i in range(n):            # if dp[i+1][j] == 1 and dp[i][j-1] == 1:        if i > 0 and (ord(p[i]) - ord(p[i-1]) == 1 or ord(p[i]) - ord(p[i-1]) == -25):             m += 1         else:            m = 1        dp[ord(p[i]) - 97] = max(dp[ord(p[i]) - 97] ,m)    res = sum(dp)    return resp = "zabbyz"findSubstringInWraproundString(p)

 

转载于:https://www.cnblogs.com/Lee-yl/p/10070301.html

你可能感兴趣的文章
python3 no module named yaml
查看>>
【Android】 BroadcastReceiver详解
查看>>
Alpha冲刺第7天
查看>>
求弦长或线段长【初级中级高阶辅导】
查看>>
SocketFromServer
查看>>
[吴恩达机器学习笔记]12支持向量机5SVM参数细节
查看>>
Postman的Post请求方式的四种类型的数据
查看>>
Android事件分发机制初探
查看>>
CF1030E Vasya and Good Sequences
查看>>
jzoj5683. 【GDSOI2018模拟4.22】Prime (Min_25筛+拉格朗日插值+主席树)
查看>>
洛谷P1850 换教室(概率dp)
查看>>
ASP.NET拾遗 - Health Monitoring
查看>>
Handler
查看>>
移动端APP meta标签
查看>>
使用webpack 进行ES6开发
查看>>
VS 断点不会命中的情况
查看>>
通用类 Js 显示消息提示对话框,不输出页面内容,并返回上一页
查看>>
格式化字符串
查看>>
Oracle通过SQL语句查看table所引用的对象(View/Function/Procedure/Trigger)
查看>>
jenkins权限配置不对导致jenkins无法登陆
查看>>