Finding all palindromes in String.
Naive Thinking: Use the method described in longest-palindromic-substring . There are covered ranges for each character. That's the result we want.
Time complexity O(n^2) (because to generate output, Hoops, that seems not great benefit using longest-palindrome's algorithm)
Space O(n^2) (Also because of the output).
Naive Thinking: Use the method described in longest-palindromic-substring . There are covered ranges for each character. That's the result we want.
Time complexity O(n^2) (because to generate output, Hoops, that seems not great benefit using longest-palindrome's algorithm)
Space O(n^2) (Also because of the output).
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
public class Solution{
public static void main(String args[]){
Solution s = new Solution();
List<String> list = s.findAllPalindrome("abbbbabaaabab");
System.out.println(list);
}
public List<String> findAllPalindrome(String s){
List<String> list = new ArrayList<String>();
Set<String> set = new HashSet<String>();
String str = preProcess(s);
int f[] = new int[str.length()]; // coverage
int p = 0; // pivot
for(int i = 1;i < str.length();i++){
// check if position i is in pivot's coverage
if(p + f[p] > i){
if(2*p-i - f[2*p-i] > p-f[p])
f[i] = f[2*p-i];
else
f[i] = f[p] - (i-p);
}else{
f[i] = 0;
}
// extend if necessary
int j = 1;
while(i-f[i]-j >= 0 && i+f[i]+j < str.length() && str.charAt(i+f[i]+j)==str.charAt(i-f[i]-j)) j++;
f[i] += j-1;
// check if need to replace pivot
if(i+f[i] > p+f[p]) p = i;
}
// generate result
for(int i = 0;i < f.length;i++)
for(int j = 2;j <= f[i];j++)
set.add(s.substring((i-j)/2,(i+j+1)/2));
list.addAll(set);
return list;
}
private String preProcess(String s){
StringBuilder str = new StringBuilder();
for(int i = 0;i < s.length();i++){
str.append("#");
str.append(s.charAt(i));
}
str.append("#");
return str.toString();
}
}
No comments:
Post a Comment