重新排列字符串中的字符,使得 C++ 中没有两个相邻的字符相同
我们得到一个字符串,比方说,任何给定长度的str。任务是以这样的方式重新排列给定的字符串,即在结果字符串中不会有相同的相邻字符排列在一起。
让我们看看这个的各种输入输出场景-
输入 -字符串str="itinn"
输出 -字符串中字符的重新排列使得没有两个相邻的字符相同:initn。
说明 -我们给定了一个字符串类型变量,比如说,str。现在我们将以这样一种方式重新排列输入字符串的字符,即不会在相同位置出现两个相同的字符,即移动“nn”,因为它们相同且彼此相邻。所以最后的字符串将是'initn'。
输入 -字符串str="abbaabbaa"
输出 -字符串中字符的重新排列使得没有两个相邻的字符相同是:ababababa
说明-我们给定了一个字符串类型变量,比如说,str。现在我们将以这样一种方式重新排列输入字符串的字符,即不会在同一位置出现两个相同的字符,即移动'bb','aa','bb','aa'因为它们相同并且相邻其他。所以最后的字符串将是'ababababa'。
下面程序中使用的方法如下
输入一个字符串类型的变量,比如str并计算字符串的大小并将其存储在一个名为变量的长度中。
检查IF长度为0然后返回。
将数据传递给函数Rearrangement(str,length)。
函数内部Rearrangement(arr,length)
用(length+1)/2设置字符串的大小。
将向量类型变量声明为vec(26,0),它将存储整数类型数据和字符串类型的ptr为ptr(length,'')。整数类型的临时变量为0。
开始循环FOR以遍历str。在循环内,设置vec[it-'a']++。
创建一个字符类型变量作为ch并通过调用maximum(vec)函数来设置它。
声明一个整型变量为total并用vec[ch-'a']设置它。
检查IFtotal大于size然后返回。
开始循环WHILEtotal然后将ptr[temp]设置为ch,将temp设置为temp+2并将总数减1。
将vec[ch-'a']设置为0。从i到0开始循环FOR,直到i小于26。在循环内,当vec[i]大于0时开始。将temp设置为(temp>=length)?1:temp和ptr[temp]到'a'+i和temp到temp+2并将vec[i]减1。
返回指针
在函数内charmaximum(constvector<int>&vec)
将整数类型变量声明为0,字符类型变量声明为“c”
从i到0开始循环FOR,直到i小于26。在循环内,检查IFvec[i]是否小于high,然后将high设置为vec[i]并将c设置为'a'+i。
返回c
打印结果。
示例
#include <bits/stdc++.h> using namespace std; char maximum(const vector<int>& vec){ int high = 0; char c; for(int i = 0; i < 26; i++){ if(vec[i] > high){ high = vec[i]; c = 'a' + i; } } return c; } string Rearrangement(string str, int length){ int size = (length + 1) / 2; vector<int> vec(26, 0); string ptr(length, ' '); int temp = 0; for(auto it : str){ vec[it - 'a']++; } char ch = maximum(vec); int total = vec[ch - 'a']; if(total > size){ return ""; } while(total){ ptr[temp] = ch; temp = temp + 2; total--; } vec[ch - 'a'] = 0; for(int i = 0; i < 26; i++){ while (vec[i] > 0){ temp = (temp >= length) ? 1 : temp; ptr[temp] = 'a' + i; temp = temp + 2; vec[i]--; } } return ptr; } int main(){ string str = "itinn"; int length = str.length(); if(length == 0){ cout<<"Please enter a valid string"; } string count = Rearrangement(str, length); if(count == ""){ cout<<"Please enter a valid string"; } else{ cout<<"字符串中字符的重新排列使得没有两个相邻的字符相同: "<<count; } return 0; }输出结果
如果我们运行上面的代码,它将生成以下输出
字符串中字符的重新排列使得没有两个相邻的字符相同: initn