大小为N的给定字符串str由小写英文字母组成。任务是找到字符串字符的排列方式,以使两个相邻字符都不是英语字母表中的相邻字符。如果有多个答案,请打印其中的任何一个。如果没有这样的安排,则打印-1。
例子:
Input: str = “aabcd”
Output: bdaac
No two adjacent characters are neighbours in English alphabets.
Input: str = “aab”
Output: -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