zoukankan      html  css  js  c++  java
  • [LeetCode] 267. 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.

    Example 1:

    Input: "aabb"
    Output: ["abba", "baab"]

    Example 2:

    Input: "abc"
    Output: []

    回文排列II。

    给定一个字符串 s ,返回其通过重新排列组合后所有可能的回文字符串,并去除重复的组合。如不能形成任何回文排列时,则返回一个空列表。

    思路是backtracking。对于一个input字符串而言,他自己不一定是回文,但是如果字符串里面只有至多一个字符的出现次数是奇数,其他字符的出现次数都是偶数,那么他的permutation就可以组成回文。所以我们首先统计一下input字符串里面各个字母的出现次数,如果统计结果不能满足回文的条件则返回一个空集res,否则我们就可以开始找可以组成的回文串。

    我们先找一下,是否有出现过奇数次数的字母,如果有,则这个字母只能作为回文串中间的那个字母。之后就是用一个helper函数去做permutation。退出条件就是生成的字符串的长度和input字符串的长度一样,加入结果集。

    时间 - ?

    空间O(n)

    Java实现

     1 class Solution {
     2     public List<String> generatePalindromes(String s) {
     3         List<String> res = new ArrayList<>();
     4         int[] map = new int[256];
     5         int odd = 0;
     6         for (char c : s.toCharArray()) {
     7             map[c]++;
     8             if (map[c] % 2 == 1) {
     9                 odd++;
    10             } else {
    11                 odd--;
    12             }
    13         }
    14 
    15         // corner case
    16         if (s.length() == 0 || odd > 1) {
    17             return res;
    18         }
    19         // normal case
    20         String temp = "";
    21         for (int i = 0; i < 256 && odd == 1; i++) {
    22             if (map[i] % 2 == 1) {
    23                 temp += (char) i;
    24                 map[i]--;
    25                 break;
    26             }
    27         }
    28         helper(res, temp, map, s.length());
    29         return res;
    30     }
    31 
    32     private void helper(List<String> res, String temp, int[] map, int n) {
    33         if (temp.length() == n) {
    34             res.add(temp);
    35             return;
    36         }
    37         for (int i = 0; i < 256; i++) {
    38             if (map[i] > 0) {
    39                 map[i] -= 2;
    40                 helper(res, (char) i + temp + (char) i, map, n);
    41                 map[i] += 2;
    42             }
    43         }
    44     }
    45 }

    LeetCode 题目总结

  • 相关阅读:
    LeetCode OJ-- Interleaving String **@
    二叉树遍历 Morris
    LeetCode OJ--Binary Tree Zigzag Level Order Traversal *
    LeetCode OJ-- Letter Combinations of a Phone Number ***
    【转】 堆和栈的区别
    LeetCode OJ-- Valid Sudoku
    LeetCode OJ--Word Break II ***@
    LeetCode OJ-- Surrounded Regions **@
    add host bat
    SP2013 SP1(kb28805502)补丁安装测试初体验
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13968707.html
Copyright © 2011-2022 走看看