查找字符串中重复次数最多的子字符串,若有多个,返回最长的一个

#include <iostream>#include <string>#include <vector>using namespace std;class Solution {public: string longestRepeatOfStrings(string str) { if(str.size()==0) retur...
摘要由CSDN通过智能技术生成

这题不知道该用什么类型总结好,强行分一分的话感觉应该分到https://zhuanlan.zhihu.com/p/104983442说的【拓扑排序类型】里。


分析 1:

对于重复次数最多且出现次数为N的最长的子字符串,显然当中的每个字符在原字符串中都恰好出现N遍。

即:假如a、b、c出现的次数有10遍,且是出现最多的字符,那最长的子字符串必然是出现了10遍的、由abc中的三个或两个或一个字符组成的字符串。

因此第一趟遍历先把每个字符出现的次数算出来。(repeatChar)

分析 2:

出现次数最多的字符们,如果参与建设了最长的那个重复字符串,显然它们会一直捆绑在一起,相邻的元素始终相邻。

因此第二趟遍历统计每个字符前面的字符是啥。(formerLetter)

逻辑:

vector<int> formerLetter(26,-2) // formerLetter初始化为-2
repeatChars[str[i]-'a'] == max ?// 该字符重复次数最多吗?

    否:flag = false // flag用于标记遍历的上一个字符是否重复次数最多的。下一轮!

    是:flag == true ? // 上一个字符重复次数也是最多的吗?
        否:formerLetter[str[i]-'a'] = -1 // formerLetter中该字符标-1,代表没有前缀,是根节点

        是:formerLetter[str[i]-'a'] == str[i-1] -'a' ?// formerLetter中之前标记的该字符前缀也跟现在显示的前缀一致吗?
            或
            formerLetter[str[i]-'a'] == -2 ?// formerLetter中该字符的前缀还刚初始化,从未使用过?
            否:formerLetter[str[i]-'a'] = -1 // formerLetter标成根节点
            是:formerLetter[str[i]-'a']
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值