这题不知道该用什么类型总结好,强行分一分的话感觉应该分到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']