find palindrome pairs

63 篇文章 0 订阅

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;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值