当前位置: 首页 > 编程笔记 >

在C ++中打印字符串的所有回文排列

颛孙哲
2023-03-14
本文向大家介绍在C ++中打印字符串的所有回文排列,包括了在C ++中打印字符串的所有回文排列的使用技巧和注意事项,需要的朋友参考一下

在这个问题中,给了我们一个字符串,我们必须打印出该字符串中所有可能的回文排列。

让我们以一个例子来了解问题-

输入: string ='aabb'

输出: abba baab

为了解决这个问题,我们必须采用字符串的字符,并使用这些字符一一生成所有回文字符串。

步骤1-检查字符串是否是回文,如果不是,则打印“ Not不可能”。

步骤2-如果可以产生回文,则将其切成两半,然后按字典顺序选择字符串中的每个字母。

步骤3-遍历创建的排列并反转偶数长度的字符串和奇数频率的一半,奇数字符应居中以创建回文。

步骤4-打印所有创建的回文。

程序来实现算法-

示例

#include <bits/stdc++++.h>
using namespace std;
#define M 26
bool isPalindrome(string str, int* freq){
   memset(freq, 0, M * sizeof(int));
   int l = str.length();
   for (int i = 0; i < l; i++)
      freq[str[i] - 'a']++;
   int odd = 0;
   for (int i = 0; i < M; i++)
      if (freq[i] % 2 == 1)
   odd++;
   if ((l % 2 == 1 && odd == 1 ) || (l %2 == 0 && odd == 0))
      return true;
   else
      return false;
}
string reverse(string str){
   string rev = str;
   reverse(rev.begin(), rev.end());
   return rev;
}
void generatePalindromePermutation(string str){
   int freq[M];
   if (!isPalindrome(str, freq))
   return;
   int l = str.length();
   string half ="";
   char oddC;
   for (int i = 0; i < M; i++) {
      if(freq[i] % 2 == 1)
      oddC = i + 'a';
      half += string(freq[i] / 2, i + 'a');
   }
   string palindrome;
   do {
      palindrome = half;
      if (l % 2 == 1)
         palindrome += oddC;
      palindrome += reverse(half);
      cout<<palindrome<<endl;
   }
   while (next_permutation(half.begin(), half.end()));
}
int main() {
   string str="abab";
   cout<<"All palindrome permutations of "<<str<<" are :\n";
   generatePalindromePermutation(str);
   return 0;
}

输出结果

All palindrome permutations of abab are :
abba
baab
 类似资料:
  • 本文向大家介绍打印给定字符串的所有排列,包括了打印给定字符串的所有排列的使用技巧和注意事项,需要的朋友参考一下 打印给定字符串的所有排列是回溯问题的一个示例。我们将减小子字符串的大小以解决子问题,然后再次回溯以从该部分获得另一个排列。 例如,如果字符串是ABC,则所有排列将是ABC,ACB,BAC,BCA,CAB,CBA。 该算法的复杂度为O(n!)。这是一个巨大的复杂性。当字符串大小增加时,需要

  • 本文向大家介绍C语言实现输入一个字符串后打印出该字符串中字符的所有排列,包括了C语言实现输入一个字符串后打印出该字符串中字符的所有排列的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C语言实现输入一个字符串后打印出该字符串中字符的所有排列的方法,属于数学里的排列问题。是一个很实用的算法技巧。分享给大家供大家参考。具体实现方法如下: 例如输入字符串abc,则输出由字符a、b、c所能排列出来的

  • 本文向大家介绍使用C ++中的ArrayList打印字符串的所有子序列,包括了使用C ++中的ArrayList打印字符串的所有子序列的使用技巧和注意事项,需要的朋友参考一下 在这个问题中,我们得到一个字符串,并且我们必须打印该字符串的所有子序列。子字符串是通过删除元素形成的。而且,字符串的顺序不应更改。 让我们举个例子来更好地理解问题- 为了解决这个问题,我们将找到所有子字符串,从冻结字符串的第

  • 我试图编写一个方法,使用递归打印字符串的所有排列。现在,我有这样的代码: 它打印出正确的结果,但我试图在不使用循环的情况下解决它,包括第4行中的循环。可能吗?如果是这样,你会如何解决?非常感谢。 我试图添加第三个名为index的参数,并在第5行的递归调用中写入index 1,但没有成功。我认为添加第三个参数是个好主意,我只是不知道如何使用它。

  • 我想我需要删除字符0-31和127。 是否有一个函数或一段代码来高效地做到这一点?

  • 问题内容: 我想在同一行上打印列表中的项目。我尝试过的代码: 输出= 我想输出到= 此代码仍在新行上打印我的模具的ASCII艺术表示。我想将其打印在同一行上,以节省空间并在一个屏幕上显示每个玩家的状态。 问题答案: 由于的元素是多行字符串,因此要比这更难。 首先,从每个字符串的开头删除换行符,并确保ASCII图形中的所有行都具有相同的长度。 然后尝试以下 如果您将描述的更改应用于ASCII艺术作品

  • 问题内容: 打印列表中元素之前的“ u”?我没有在代码中键入u。 当我运行此命令时,它将打印列表,但其格式如下: 那些“ u”来自列表中每个元素的位置? 问题答案: 我认为您实际上对此感到惊讶的是,打印单个字符串与打印字符串列表的功能不同–无论是否为Unicode,这都是事实: 即使没有,您也有多余的引号,更不用说反斜杠转义了。而且,如果您使用字节字符串而不是字符串尝试相同的操作,那么您仍然会使用

  • 问题内容: 我想我需要删除0-31和127字符, 是否有功能或一段代码可以有效地做到这一点。 问题答案: 7位ASCII? 如果您的Tardis刚好在1963年登陆,并且您只想要7位可打印的ASCII字符,则可以使用以下方法从0-31和127-255中删除所有内容: 它匹配0-31、127-255范围内的任何内容并将其删除。 8位扩展ASCII? 您掉进了热水浴缸计时机,而您又回到了八十年代。如果