博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Palindrome Pairs
阅读量:6394 次
发布时间:2019-06-23

本文共 3159 字,大约阅读时间需要 10 分钟。

Given a list of unique words. Find all pairs of distinct indices (i, j) in the given list, so that the concatenation of the two words, i.e. words[i] + words[j] is a palindrome.

Example 1:

Given words = ["bat", "tab", "cat"]
Return [[0, 1], [1, 0]]
The palindromes are ["battab", "tabbat"]
Example 2:
Given words = ["abcd", "dcba", "lls", "s", "sssll"]
Return [[0, 1], [1, 0], [3, 2], [2, 4]]
The palindromes are ["dcbaabcd", "abcddcba", "slls", "llssssll"]

解题思路

首先想到的是暴力组合,分别检验所有组合是否为回文,该方法提交后超时,暴力代码如下:

//Time Limit Exceededpublic class Solution {
public List
> palindromePairs(String[] words) { List
> indices = new ArrayList<>(); for (int i = 0; i < words.length; i++) { for (int j = 0; j < words.length; j++) { if (j == i) { continue; } else { String temp = words[i] + words[j]; if (isPalindrome(temp)) { List
list = new ArrayList<>(); list.add(i); list.add(j); indices.add(list); } } } } return indices; } private boolean isPalindrome(String word) { for (int i = 0, j = word.length() - 1; i < j; i++, j--) { if (word.charAt(i) != word.charAt(j)) { return false; } } return true; }}

于是想到另一种思路:

  1. 对于空字符串,如果数组中有回文字符串,则将空字符串与回文字符串进行组合。
  2. 对于非空字符串,将其进行拆分,如果其中一段为回文,并且数组中可以找到另一段的逆序字符串,则说明可以组合为回文。
    例如:”sssll” = “ss” + “sll”,而且数组中存在”lls”,因此组合”lls”和”sssll”。

注意:组合两个字符串时,需要注意顺序问题。如果字符串前半段为回文,则另一个字符串需要组合在前面;如果字符串后半段为回文,则另一个字符串需要组合在后面。

实现代码

//Runtime: 247 mspublic class Solution {
public List
> palindromePairs(String[] words) { Map
map = new HashMap<>(); for (int i = 0; i < words.length; i++) { map.put(words[i], i); } List
> indices = new ArrayList<>(); for (int i = 0; i < words.length; i++) { if (words[i].length() == 0) { for (Map.Entry
entry : map.entrySet()) { if (isPalindrome(entry.getKey())) { addAll(indices, i, entry.getValue()); } } } for (int j = 0; j < words[i].length(); j++) { String front = words[i].substring(0, j); String back = words[i].substring(j, words[i].length()); String rfront = reverse(front); String rback = reverse(back); if (isPalindrome(front) && map.containsKey(rback)) { addAll(indices, map.get(rback), i); } if (isPalindrome(back) && map.containsKey(rfront)) { addAll(indices, i, map.get(rfront)); } } } return indices; } private void addAll(List
> indices, int a, int b) { if (a == b) { return; } List
list = new ArrayList<>(); list.add(a); list.add(b); indices.add(list); } private String reverse(String word) { return new StringBuilder(word).reverse().toString(); } private boolean isPalindrome(String word) { for (int i = 0, j = word.length() - 1; i < j; i++, j--) { if (word.charAt(i) != word.charAt(j)) { return false; } } return true; }}

转载地址:http://pkmha.baihongyu.com/

你可能感兴趣的文章
olabuy-时光从来素默,内心应保持一份素淡与简静
查看>>
kux文件怎么打开 苹果手机如何观看kux视频
查看>>
Python中的urllib.request模块
查看>>
第九课 《说人话》
查看>>
js对象数组排序
查看>>
如何实现在展示商品时,放大商品细节
查看>>
uboot boot流程分析
查看>>
如何学习PHP整个体系的?
查看>>
Enterprise and the press public MBT Fora
查看>>
js常用代码整理
查看>>
富文本编辑器TinyMCE
查看>>
01_vue实例_数据_方法
查看>>
“穿越”——正则表达式
查看>>
使用 find 命令实现高级排除需求
查看>>
一只年轻而倒悬的梨
查看>>
解决time_wait过多的问题
查看>>
技术转载:Jni学习一:了解Jni
查看>>
vue教程2-07 自定义指令
查看>>
python3调用阿里云短信服务
查看>>
Linux-百度云之AccleriderMini使用
查看>>