given a list of words, find palindrome pairs
import java.util.*;
public class GetPalindomPairs {
public static void main(String[] args) {
Set<String> dict1 = new HashSet<>();
dict1.add("a");
dict1.add("aa");
dict1.add("aaa");
for (List<String> list: getPairs(dict1)) {
for (String str: list) {
System.out.print(str+" ");
}
System.out.println("========");
}
System.out.println("++++++++");
Set<String> dict2 = new HashSet<>();
dict2.add("abcd");
dict2.add("dcbaz");
for (List<String> list: getPairs(dict2)) {
for (String str: list) {
System.out.print(str+" ");
}
System.out.println("========");
}
}
public static List<List<String>> getPairs(Set<String> dict) {
List<List<String>> result = new ArrayList<List<String>>();
for (String s : dict) {
for (int i = 0; i < s.length(); ++i) {
String s1 = s.substring(0, i);
String s2 = s.substring(i, s.length());
if (isPal(s1)) {
judge(result, s, s2, dict, false);
}
if (isPal(s2)) {
judge(result, s, s1, dict, true);
}
}
}
return result;
}
public static void judge(List<List<String>> result, String s, String compare, Set<String> dict, boolean position) {
char[] array = compare.toCharArray();
for (int j = 0; j < compare.length() / 2; ++j) {
char c = array[j];
array[j] = array[compare.length() - j - 1];
array[compare.length() - j - 1] = c;
}
String reverse = new String(array);
if (dict.contains(reverse) && !reverse.equals(s)) {
List<String> list = new ArrayList<String>();
if (position) {
list.add(s);
list.add(reverse);
} else {
list.add(reverse);
list.add(s);
}
result.add(list);
}
}
public static boolean isPal(String s) {
if (s.length() <= 1)
return true;
int left = 0;
int right = s.length() - 1;
while (left < right) {
if (s.charAt(left) != s.charAt(right))
return false;
++left;
--right;
}
return true;
}
}