`

Leetcode - Palindrome Permutation II

 
阅读更多
Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form.

For example:

Given s = "aabb", return ["abba", "baab"].

Given s = "abc", return [].

[分析]
先按照Palindrome Permutation 的方法判断输入字符串 s 能否排列成为一个回文串。通过检查开始构造过程,有两个思路:
思路1:按照leetcode的提示,我们仅需构造回文的前半部分。先利用前面判断过程中的map获得回文前半部分所有的字符,相同字符排列在一起,然后按照Permutation II一题的思路获得前半部分所有的排列情况,最后组合回文的前后部分加入结果集。
思路2:从中间往两端递归构造回文串。

[ref]
https://leetcode.com/discuss/53638/0ms-easy-c-solution
https://leetcode.com/discuss/53613/my-accepted-java-solution

public class Solution {
    // Method 1
    public List<String> generatePalindromes(String s) {
        List<String> ret = new ArrayList<String>();
        if (s == null || s.length() == 0) return ret;
        if (s.length() == 1) {ret.add(s); return ret;}
        int[] map = new int[256];
        for (int i = 0; i < s.length(); i++)
            map[s.charAt(i)]++;
        int oddCount = 0;
        int oddIdx = -1;
        StringBuilder half = new StringBuilder();
        for (int i = 0; i < 256; i++) {
            if ((map[i] & 1) == 1) {
                oddIdx = i;
                oddCount++;
                if (oddCount == 2) return ret;
            }
            int halfCount = map[i] / 2;
            for (int j = 0; j < halfCount; j++)
                half.append((char)i);
        }
        List<String> halfPermutation = new ArrayList<String>();
        getPermutation(half.toString().toCharArray(), new boolean[half.length()], new StringBuilder(), halfPermutation);
        for (String curr : halfPermutation) {
            StringBuilder curr2 = new StringBuilder(curr);
            if (oddIdx != -1)
                curr += (char)oddIdx;
            ret.add(curr + curr2.reverse().toString()); 
        }
        return ret;
    }
    
    public void getPermutation(char[] chars, boolean[] used, StringBuilder item, List<String> result) {
        if (item.length() == chars.length) {
            result.add(item.toString());
        } else {
            for (int i = 0; i < chars.length; i++) {
                if (used[i] || (i > 0 && chars[i] == chars[i - 1] && !used[i - 1]))
                    continue;
                item.append(chars[i]);
                used[i] = true;
                getPermutation(chars, used, item, result);
                used[i] = false;
                item.deleteCharAt(item.length() - 1);
            }
        }
    }
    // Method 2
    public List<String> generatePalindromes2(String s) {
        List<String> ret = new ArrayList<String>();
        int[] map = new int[256];
        for (int i = 0; i < s.length(); i++)
            map[s.charAt(i)]++;
        int oddCount = 0;
        int oddIdx = -1;
        for (int i = 0; i < 256; i++) {
            if ((map[i] & 1) == 1) {
                oddIdx = i;
                oddCount++;
                if (oddCount == 2) return ret;
            }
        }
        String curr = "";
        if (oddIdx != -1) {
            curr += (char)oddIdx;
            map[oddIdx]--;
        }
        dfs(curr, map, s.length(), ret);
        return ret;
    }
    public void dfs(String curr, int[] map, int n, List<String> ret) {
        if (curr.length() < n) {
            for (int i = 0; i < map.length; i++) {
                if (map[i] > 0) {
                    curr = (char)i + curr + (char)i;
                    map[i] -= 2;
                    dfs(curr, map, n, ret);
                    curr = curr.substring(1, curr.length() - 1);
                    map[i] += 2;
                }
            }
        } else {
            ret.add(curr);
        }
    }
}
分享到:
评论

相关推荐

    java-leetcode题解之Palindrome Permutation II.java

    java java_leetcode题解之Palindrome Permutation II.java

    java-leetcode题解之Palindrome Permutation.java

    java java_leetcode题解之Palindrome Permutation.java

    數位之和leetcode-leetcode-cpp:我的LeetCodeC++答案

    permutation - combination sum: 39, 40, 216 - palindrome partitioning - regex - sudoku solver: 37 排序 - merge sort - quick sort - insertion sort - selection sort - counting sort 位操作 - find the only...

    leetcode-回文数,回文串(非dp,排序问题哈,dp太难,以后再总结)

    266:https://leetcode-cn.com/problems/palindrome-permutation/ 题目: 思路:判断能否形成回文串,那只要数奇数个字符的种类是否大于2,大于2肯定不可以形成 代码: 409:...

    leetcode答案-leetcode-[removed]用javascript刷LeetCode

    另一类常见问题是字符串处理,如"Palindrome Permutation"(回文排列)。我们可以利用JavaScript的字符串方法(如split、reverse、join)和计数器来判断一个字符串是否可以通过重新排列字符形成回文串。 此外,对于...

    戳气球leetcode-leetcode:leetcode

    leetcode category other hot keywords:Palindrome(mic), Subsequence Array 螺旋矩阵Spiral Matrix 顺时针打印矩阵 Next Permutation Product of Array Except Self 189.rotate-array 283.move-zero Range Sum ...

    雨水leetcode-Competitive-Coding:包含来自hackerrank、codechef、leetcode、intervie

    1)Permutation_Palindrome - Easy - Codechef - {涵盖了地图(stl)和回文逻辑的最佳使用} 2)句子中单词的出现 - 简单 - Coding Ninjas - {Learned to use 'getline','stringstream','map','itreating over a map'...

    LeetCode最全代码

    137 | [Single Number II](https://leetcode.com/problems/single-number-ii/) | [C++](./C++/single-number-ii.cpp) [Python](./Python/single-number-ii.py) | _O(n)_ | _O(1)_ | Medium ||| 190 | [Reverse Bits]...

    Leetcode题目+解析+思路+答案.pdf

    - **Palindrome Number**:判断一个数字是否是回文数。 - **Search a 2D Matrix**:在二维矩阵中搜索目标值。 - **Search for a Range**:在一个排序数组中查找目标值的第一个和最后一个位置。 - **Search ...

    Leetcode答案(c++版)

    **1.16 Palindrome LinkedList (234)** - **问题描述**:判断链表是否为回文结构。 - **解题思路**: - 使用快慢指针找到链表的中间位置。 - 反转后半部分链表,然后比较前后两部分是否完全相同。 **1.17 Odd ...

    uber leetcode

    #### 九、Palindrome Permutation - **知识点:**哈希表、计数。 - **题目描述:**给定一个字符串,编写一个函数判定其是否为某个字符串的排列的回文串。 - **应用场景:**字符串处理中的常见问题,用于文本分析、...

    LeetCode练习答案

    - **基本计算器II(Basic Calculator II)**: 给定一个字符串表达式,实现一个基本计算器来计算并返回结果。 以上总结仅为部分知识点的简述,对于每一个具体的算法问题,都有其独特的解决思路和技巧,建议深入研究每...

    Coding Interview In Java

    leetcode Java 246 題目及解答 (英文) Contents 1 Rotate Array in Java 15 2 Reverse Words in a String II 19 3 Evaluate Reverse Polish Notation 21 4 Isomorphic Strings 25 5 Word Ladder 27 6 Word Ladder ...

    Amazon近半年电面题.pdf

    根据提供的文件内容,我们可以了解到一些关于亚马逊公司面试中所采用的编程题目的详细信息,以及这些题目在LeetCode上的对应编号。文件内容中列出了一系列题目,它们覆盖了不同的编程领域,包括算法、数据结构以及...

Global site tag (gtag.js) - Google Analytics