通过将每个字符按其频率循环右移来修改字符串
在这个问题中,我们需要将给定字符串中的每个字符按其频率右移。为了解决这个问题,我们可以计算每个字符的频率,并将其存储在数组或映射等数据结构中。之后,我们可以使用字符的 ASCII 值,根据每个字符的频率右移。
问题描述- 给定一个包含小写字符且长度为 N 的字符串 str。我们需要将字符串中的每个字符右移,该字符的频率等于给定字符串中该特定字符的频率。
示例
输入– str = 'tutorialspoint'
输出– wvwqskbmtqqkow
解释
't' 的频率为 3。因此,'t' + 3 = w。
'u' 的频率为 1。因此,'u' + 1 = v
'o' 的频率为 2。因此,'o' + 2 = q。
'r' 的频率为 1。因此,'r' + 1 = s。
'i' 的频率为 2。因此,'i' + 2 = k。
'a' 的频率为 1。因此,'a' + 1 = b。
'l' 的频率为 1。因此,'l' + 1 = m。
's' 的频率为 1。因此,'s' + 1 = t。
'p' 的频率为 1。因此,'p' + 1 = q。
'n' 的频率为 1。因此,'n' + 1 = o.
输入 – str = 'xxxxyyyzz'
输出 – 'bbbbbbbbb'
解释
"x"的频率是 4。因此,'x' + 4 = b,因为我们需要进行循环移位。
"y"的频率是 3。因此,'y' + 3 = b。
"z"的频率是 4。因此,'z' + 2 = b。
方法 1
在此方法中,我们将使用 map 数据结构来计算并存储给定字符串中每个字符的频率。之后,我们可以遍历字符串并根据每个字符的频率对其进行循环移位。
算法
定义"mp"map 来存储字符 ->频率
定义"len"变量,并使用 length() 方法存储字符串的长度。
使用 for 循环遍历字符串。在循环中,通过将当前值加 1 来更新字符的频率。
现在,再次遍历字符串中的每个字符。
在循环中,获取当前字符的频率,并对 26 进行模运算。将结果存储在"freq"变量中。这里,我们需要将字符右移 freq 的值,就像我们将字符右移 26 一样。
如果 str[i] + freq 的 ASCII 值小于 z 的 ASCII 值,则将 str[i] 字符加上 freq 的值进行更新。
否则,将 str[i] 的 ASCII 值加到 freq 中,并减去 z 的 ASCII 值。然后将结果加到 str[i] 中。
返回最终字符串
示例
#include <iostream> #include <map> //#include <set> using namespace std; // 函数将字符串中每个字符按其频率进行移位。 string shiftCharByFrequancy(string str){ // 用于存储每个字符频率的映射 map<char, int> mp; int len = str.length(); // 遍历字符串 for (int i = 0; i < len; i++){ // 更新当前字符的频率 mp[str[i]] += 1; } // 遍历字符串 str for (int i = 0; i < len; i++){ // 获取当前字符的频率 int freq = mp[str[i]] % 26; // 如果 str[i] + freq 的 ASCII 值小于或等于 'z' 的 ASCII 值,则通过添加 freq 来更新字符。 if (str[i] + freq <= 'z'){ str[i] = char(int(str[i]) + freq); } else { // 否则从 str[i] + freq 中减去 'z' 的 ASCII 值并将其添加到 'a' - 1 的 ASCII 值以获取更新的字符。 freq = freq - 'z' + str[i]; str[i] = char(int('a') + freq - 1); } } return str; } int main(){ string str = "tutorialspoint"; cout << "将字符串中的每个字符按其频率循环右移后的结果字符串是 " << shiftCharByFrequancy(str); return 0; }
输出
将字符串中的每个字符按其频率循环右移后的结果字符串是 wvwqskbmtqqkow
时间复杂度 – O(N),因为我们遍历了长度为 N 的字符串。
空间复杂度 – (26) ~ O(1),因为我们使用 map 来存储字符的频率。
在本教程中,我们学习了如何根据每个字符的频率对其进行右移。我们使用 map 来存储频率,用户也可以使用数组或向量来存储频率。此外,count() 方法还可以用来计算特定字符的频率。