求字符串首尾相同且最长的子串集合
如:
输入abecdaffaebe,结果为becdaffaeb, ecdaffaebe
输入abcdefg,结果为a, b, c, d, e, f, g
输入abacdeaf,结果为abacdea
思路:统计每个字符最先出现的位置和最后出现的位置,相差最大即为最长,然后再根据两个位置值对字符串进行分割;符合条件的子串个数为[1, n]。
/**
* 定义一个结构体,保存字符最先出现的位置和最后出现的位置
*/
static class CharPosition {
int firstPosition = 0;
int lastPosition = 0;
public int getLen() {
return lastPosition - firstPosition + 1;
}
}
/**
* 获取字符串首尾相同且最长的子串集合;
* 符合条件的子串个数为[1, n];
* 采用最小堆存储最长的子串;
* 时间复杂度为O(n);最坏情况O(3n),即没有一个重复字符时;
* */
public static ArrayList<String > getLongestSubStrings(String str) {
if(TextUtils.isEmpty(str)) {
return null;