📌  相关文章
📜  如果可能,重新排列字符以形成回文

📅  最后修改于: 2022-05-13 01:57:07.205000             🧑  作者: Mango

如果可能,重新排列字符以形成回文

给定一个字符串,将字符串转换为回文而不做任何修改,如添加字符、删除字符、替换字符等。

例子:

Input : "mdaam"
Output : "madam" or "amdma"

Input : "abb"
Output : "bab"

Input : "geeksforgeeks"
Output : "No Palindrome"

1.计算所有字符的出现次数。
2. 计算奇数。如果这个计数大于 1 或等于 1 并且字符串的长度是偶数,那么显然回文不能从给定的字符串形成。
3.初始化两个空字符串firstHalf和secondHalf。
4. 遍历地图。对于 count 为 count 的每个字符,将 count/2 个字符附加到 firstHalf 的末尾和 secondHalf 的开头。
5.最后通过附加firstHalf和secondHalf返回结果

C++
// C++ program to rearrange a string to
// make palindrome.
#include 
using namespace std;
 
string getPalindrome(string str)
{
 
    // Store counts of characters
    unordered_map hmap;
    for (int i = 0; i < str.length(); i++)
        hmap[str[i]]++;
 
    /* find the number of odd elements.
       Takes O(n) */
    int oddCount = 0;
    char oddChar;
    for (auto x : hmap) {
        if (x.second % 2 != 0) {
            oddCount++;
            oddChar = x.first;
        }
    }
 
    /* odd_cnt = 1 only if the length of
       str is odd */
    if (oddCount > 1
        || oddCount == 1 && str.length() % 2 == 0)
        return "NO PALINDROME";
 
    /* Generate first halh of palindrome */
    string firstHalf = "", secondHalf = "";
    for (auto x : hmap) {
 
        // Build a string of floor(count/2)
        // occurrences of current character
        string s(x.second / 2, x.first);
 
        // Attach the built string to end of
        // and begin of second half
        firstHalf = firstHalf + s;
        secondHalf = s + secondHalf;
    }
 
    // Insert odd character if there
    // is any
    return (oddCount == 1)
               ? (firstHalf + oddChar + secondHalf)
               : (firstHalf + secondHalf);
}
 
int main()
{
    string s = "mdaam";
    cout << getPalindrome(s);
    return 0;
}


Java
// Java program to rearrange a string to
// make palindrome
import java.util.HashMap;
import java.util.Map.Entry;
 
class GFG{
 
public static String getPalindrome(String str)
{
     
    // Store counts of characters
    HashMap counting = new HashMap<>();
    for(char ch : str.toCharArray())
    {
        if (counting.containsKey(ch))
        {
            counting.put(ch, counting.get(ch) + 1);
        }
        else
        {
            counting.put(ch, 1);
        }
    }
     
    /* Find the number of odd elements.
    Takes O(n) */
    int oddCount = 0;
    char oddChar = 0;
     
    for(Entry itr : counting.entrySet())
    {
        if (itr.getValue() % 2 != 0)
        {
            oddCount++;
            oddChar = itr.getKey();
        }
    }
     
    /* odd_cnt = 1 only if the length of
    str is odd */
    if (oddCount > 1 || oddCount == 1 &&
        str.length() % 2 == 0)
    {
        return "NO PALINDROME";
    }
     
    /* Generate first halh of palindrome */
    String firstHalf = "", lastHalf = "";
    for(Entry itr : counting.entrySet())
    {
         
        // Build a string of floor(count/2)
        // occurrences of current character
        String ss = "";
        for(int i = 0; i < itr.getValue() / 2; i++)
        {
            ss += itr.getKey();
        }
         
        // Attach the built string to end of
        // and begin of second half
        firstHalf = firstHalf + ss;
        lastHalf = ss + lastHalf;
    }
     
    // Insert odd character if there
    // is any
    return (oddCount == 1) ?
           (firstHalf + oddChar + lastHalf) :
           (firstHalf + lastHalf);
}
 
// Driver code
public static void main(String[] args)
{
    String str = "mdaam";
    System.out.println(getPalindrome(str));
}
}
 
// This code is contributed by Satyam Singh


Python3
# Python3 program to rearrange a string to
# make palindrome.
from collections import defaultdict
 
 
def getPalindrome(st):
 
    # Store counts of characters
    hmap = defaultdict(int)
    for i in range(len(st)):
        hmap[st[i]] += 1
 
    # Find the number of odd elements.
    # Takes O(n)
    oddCount = 0
 
    for x in hmap:
        if (hmap[x] % 2 != 0):
            oddCount += 1
            oddChar = x
 
    # odd_cnt = 1 only if the length of
    # str is odd
    if (oddCount > 1 or oddCount == 1 and
            len(st) % 2 == 0):
        return "NO PALINDROME"
 
    # Generate first halh of palindrome
    firstHalf = ""
    secondHalf = ""
 
    for x in sorted(hmap.keys()):
 
        # Build a string of floor(count/2)
        # occurrences of current character
        s = (hmap[x] // 2) * x
 
        # Attach the built string to end of
        # and begin of second half
        firstHalf = firstHalf + s
        secondHalf = s + secondHalf
 
    # Insert odd character if there
    # is any
    if (oddCount == 1):
        return (firstHalf + oddChar + secondHalf)
    else:
        return (firstHalf + secondHalf)
 
 
# Driver code
if __name__ == "__main__":
 
    s = "mdaam"
 
    print(getPalindrome(s))
 
# This code is contributed by ukasp


Javascript


输出
amdma