面试题48-最长不含重复字符的子字符串
时间:2020-04-15
本文章向大家介绍面试题48-最长不含重复字符的子字符串,主要包括面试题48-最长不含重复字符的子字符串使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
找出一个字符序列中一个最长的包含不重复字符的子字符串,计算该最长子字符串的长度。比如在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4。
分析:
找最长优先考虑使用动态规划来解题
动态规划:
待求问题划分为若干个子问题(阶段),按顺序求解子问题,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些可能达到最优的局部解,依次解决各阶段,最后一个子阶段就是初始问题的解。关键找到递推关系
定义函数f(i)为第i个字符为结尾的不包含重复字符的自字符串的子字符串的最长长度,假设我们知道了f(i-1),如果第i个字符在前面没有出现过,则f(i)=f(i-1)+1,
如果第i个字符在前面出现过,d表示第i个字符与它最近一次出现的索引的间隔
如果d<=f(i-1),f(i)=d 表示第i个字符出现两次所夹的子字符串中再也没有其他重复的字符了。
d>f(i-1) f(i)=f(i-1)+1 表示,即使前面出现了,但出现在f(i-1)的最长子字符串之前
正向求解:
“arabcacfr”
f(0)=1 f(1)=f(0)+1
f(2)=2-0=2 f(3)=f(2)+1=3
f(4)=f(3)+1=4 f(5)=3
f(6)=2 f(7)=3
f(8)=4
代码实现:
def longSubstringWithoutDuplication(s):
if len(s)==0 or len(s)==1:
return len(s)
curlength=0
maxlength=0
dic={} # 存放每一个字符最后一次出现的索引
for i in range(len(s)):
# 前面没有出现过,或者出现过,间隔大于前一个字符中最大无重复字符串
if s[i] not in dic or i-dic[s[i]]>curlength:
curlength += 1
else:# 前面出现了,间隔小于前一个字符中最大无重复字符串
curlength = i-dic[s[i]]
dic[s[i]]=i
maxlength=max(curlength,maxlength)
return maxlength
if __name__ == '__main__':
s='arabcacfr'
s1='abcabcbb'
s2='a'
print(longSubstringWithoutDuplication(s2))
原文地址:https://www.cnblogs.com/shuangcao/p/12706984.html
- HTTP加速器varnish安装小记(1)
- 手把手教你估算深度神经网络的最优学习率(附代码&教程)
- 批处理判断第一个硬盘的最后一个分区并进入
- MVCC原理探究及MySQL源码实现分析
- 关于热点数据导出与加载的影响,多的是你不知道的事
- 【Python】30行代码教你将微信变成智能回复机器人
- 【python爬虫】知乎互联网话题问答内容可视化分析
- “mysqlbinlog”工具做binlog server靠谱吗?
- 看各路神仙如何大战MySQL insecure warning报警有感
- 由optimizer_switch所引起的诡异问题
- 【Oracle 12c Flex Cluster专题 】— Leaf Node的故障迁移
- MySQL中的统计信息相关参数介绍
- iOS学习——UITableViewCell两种重用方法的区别
- iOS学习——UIPickerView的实现年月选择器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法