也许您可以迭代潜在的中间字符(奇数长度回文)和字符之间的中间点(偶数长度回文),并扩展每个字符,直到您无法进一步获取(下一个左字符和右字符不匹配)。
当字符串中没有很多palidromes时,这将节省大量计算。在这种情况下,稀疏的palidrome字符串的成本将是O(n)。
对于回文密集输入,它将是 O(n^2),因为每个位置的扩展不能超过数组 / 2 的长度。显然,这甚至更少接近数组的末端。
public Set<String> palindromes(final String input) {
final Set<String> result = new HashSet<>();
for (int i = 0; i < input.length(); i++) {
// expanding even length palindromes:
expandPalindromes(result,input,i,i+1);
// expanding odd length palindromes:
expandPalindromes(result,input,i,i);
}
return result;
}
public void expandPalindromes(final Set<String> result, final String s, int i, int j) {
while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {
result.add(s.substring(i,j+1));
i--; j++;
}
}