求最长重复子串 和 最长不重复子串 思路

题目: 求任意一个字符串中的所有最长重复字串和所有最长不重复子串

最长不重复子串的解法:

       设置一个辅助数据结构(如map)记录每个字符最后一次出现的位置;遍历字符串中的每个字符,如果在map中没有出现,则不重复子串的长度+1,并更新最大字符串的长度值; 如果在map中已经出现过,则更新当前字符在map中的位置和当前不重复子串的长度,并根据更新的长度来更新最大字符串的长度;这样就可以求出该字符串中的最大不重复子串的最大长度;

但是最长不重复子串可能有多个,如何将所有子串打印出来;可以设立一个二维数组或者二维vector,来存储所有不重复子字符串的长度长度和首位置,然后遍历这这个数据结构打印最长不重复子串;


最长重复子串的解法:

大方向有两个:一个是后缀数组/后缀树, 另外一个就是KMP算法;

KMP解法:遍历字符串字符i,分别计算以i位置字符为首字符的字符串的next数组,遍历next数组选取最大的元素,更新最大重复子串的长度;打印方法可以参考不重复子串的做法;

http://hi.baidu.com/fangm/blog/item/58fd1a4c20a5eafdd72afcd0.html

实现代码:待续…


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值