📌  相关文章
📜  重新排列字符串的字符,以使两个相邻的字符都不是连续的英文字母

📅  最后修改于: 2021-05-07 18:10:08             🧑  作者: Mango

大小为N的给定字符串str由小写英文字母组成。任务是找到字符串字符的排列方式,以使两个相邻字符都不是英语字母表中的相邻字符。如果有多个答案,请打印其中的任何一个。如果没有这样的安排,则打印-1。

例子:

方法:遍历字符串并存储在一个字符串所有奇数定位的字符在另一个字符串中的奇数和偶数定位字符甚至即两个字符串中每两个连续的字符将有至少2.然后排序双方的ASCII值的绝对差值字符串。现在,如果串联(偶数+奇数)(奇数+偶数)中的任何一个有效,则打印有效的排列,否则将无法以所需的方式重新排列字符串。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function that returns true if the
// current arrangement is valid
bool check(string s)
{
    for (int i = 0; i + 1 < s.size(); ++i)
        if (abs(s[i] - s[i + 1]) == 1)
            return false;
    return true;
}
  
// Function to rearrange the characters of
// the string such that no two neighbours
// in the English alphabets appear together
void Rearrange(string str)
{
    // To store the odd and the
    // even positioned characters
    string odd = "", even = "";
  
    // Traverse through the array
    for (int i = 0; i < str.size(); ++i) {
        if (str[i] % 2 == 0)
            even += str[i];
        else
            odd += str[i];
    }
  
    // Sort both the strings
    sort(odd.begin(), odd.end());
    sort(even.begin(), even.end());
  
    // Check possibilities
    if (check(odd + even))
        cout << odd + even;
    else if (check(even + odd))
        cout << even + odd;
    else
        cout << -1;
}
  
// Driver code
int main()
{
    string str = "aabcd";
  
    Rearrange(str);
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG 
{
  
    // Function that returns true if the
    // current arrangement is valid
    static boolean check(String s) 
    {
        for (int i = 0; i + 1 < s.length(); ++i)
        {
            if (Math.abs(s.charAt(i) - 
                         s.charAt(i + 1)) == 1) 
            {
                return false;
            }
        }
        return true;
    }
  
    // Function to rearrange the characters of
    // the string such that no two neighbours
    // in the English alphabets appear together
    static void Rearrange(String str) 
    {
          
        // To store the odd and the
        // even positioned characters
        String odd = "", even = "";
  
        // Traverse through the array
        for (int i = 0; i < str.length(); ++i) 
        {
            if (str.charAt(i) % 2 == 0)
            {
                even += str.charAt(i);
            } 
            else
            {
                odd += str.charAt(i);
            }
        }
  
        // Sort both the strings
        odd = sort(odd);
        even = sort(even);
  
        // Check possibilities
        if (check(odd + even)) 
        {
            System.out.print(odd + even);
        }
        else if (check(even + odd))
        {
            System.out.print(even + odd);
        } 
        else 
        {
            System.out.print(-1);
        }
    }
      
    // Method to sort a string alphabetically 
    public static String sort(String inputString) 
    {
        // convert input string to char array 
        char tempArray[] = inputString.toCharArray();
  
        // sort tempArray 
        Arrays.sort(tempArray);
  
        // return new sorted string 
        return new String(tempArray);
    }
      
    // Driver code
    public static void main(String[] args) 
    {
        String str = "aabcd";
  
        Rearrange(str);
    }
}
  
// This code is contributed by 29AjayKumar


Python3
# Python3 implementation of the approach
  
# Function that returns true if the
# current arrangement is valid
def check(s):
  
    for i in range(len(s) - 1):
        if (abs(ord(s[i]) - 
                ord(s[i + 1])) == 1):
            return False
    return True
  
# Function to rearrange the characters 
# of the such that no two neighbours
# in the English alphabets appear together
def Rearrange(Str):
  
    # To store the odd and the
    # even positioned characters
    odd, even = "",""
  
    # Traverse through the array
    for i in range(len(Str)):
        if (ord(Str[i]) % 2 == 0):
            even += Str[i]
        else:
            odd += Str[i]
  
    # Sort both the Strings
    odd = sorted(odd)
    even = sorted(even)
  
    # Check possibilities
    if (check(odd + even)):
        print("".join(odd + even))
    elif (check(even + odd)):
        print("".join(even + odd))
    else:
        print(-1)
  
# Driver code
Str = "aabcd"
  
Rearrange(Str)
  
# This code is contributed
# by Mohit Kumar


C#
// C# implementation of the approach
using System;
      
class GFG 
{
  
    // Function that returns true if the
    // current arrangement is valid
    static Boolean check(String s) 
    {
        for (int i = 0; i + 1 < s.Length; ++i)
        {
            if (Math.Abs(s[i] - 
                         s[i + 1]) == 1) 
            {
                return false;
            }
        }
        return true;
    }
  
    // Function to rearrange the characters of
    // the string such that no two neighbours
    // in the English alphabets appear together
    static void Rearrange(String str) 
    {
          
        // To store the odd and the
        // even positioned characters
        String odd = "", even = "";
  
        // Traverse through the array
        for (int i = 0; i < str.Length; ++i) 
        {
            if (str[i] % 2 == 0)
            {
                even += str[i];
            } 
            else
            {
                odd += str[i];
            }
        }
  
        // Sort both the strings
        odd = sort(odd);
        even = sort(even);
  
        // Check possibilities
        if (check(odd + even)) 
        {
            Console.Write(odd + even);
        }
        else if (check(even + odd))
        {
            Console.Write(even + odd);
        } 
        else
        {
            Console.Write(-1);
        }
    }
      
    // Method to sort a string alphabetically 
    public static String sort(String inputString) 
    {
        // convert input string to char array 
        char []tempArray = inputString.ToCharArray();
  
        // sort tempArray 
        Array.Sort(tempArray);
  
        // return new sorted string 
        return new String(tempArray);
    }
      
    // Driver code
    public static void Main(String[] args) 
    {
        String str = "aabcd";
  
        Rearrange(str);
    }
}
  
// This code is contributed by 29AjayKumar


输出:
bdaac