重新排列字符串的字符,以形成有效的英文数字表示形式

重新排列字符串的字符,以形成有效的英文数字表示形式

在这个问题中,我们需要重新排列给定字符串的字符,以获得有效的英文数字表示。第一种方法可以是找到字符串的所有排列,提取与数字相关的英文单词,并将它们转换为数字。

另一种解决该问题的方法是从每个单词中找到一个唯一的字符。在本教程中,我们将学习解决给定问题的两种方法。

问题陈述– 我们给出了一个包含小写字符且长度为N的字符串。该字符串以随机顺序包含了[0-9]数字的英文单词表示。我们需要从字符串中提取英文单词,将它们转换为数字,并按升序显示这些数字

示例例子

输入 – str = “zeoroenwot”

输出 – ‘012’

解释– 我们可以从给定的字符串中提取出’zero’、’one’和’two’,然后按照数字的增序进行排序。

输入 – str = ‘zoertowxisesevn’

输出 – ‘0267’

Explanation – 我们可以从给定的字符串中提取出“zero”、“two”、“six”和“seven”。

方法一

在这种方法中,我们将使用next_permutation()方法来获取字符串的排列。然后,我们将从每个排列中提取与数字相关的英文单词,并跟踪从任何排列中提取的最大单词总数。根据这一点,我们将形成字符串。

算法

定义countOccurrences()函数,它接受字符串和单词作为参数。它用于计算给定字符串中特定单词的出现次数。

定义变量‘count’,并将其初始化为零。

使用while循环遍历字符串。如果我们在当前位置找到了该单词,则将’count’的值增加1,并将’pos’的值跳过单词的长度。

返回‘count’的值

convertToDigits() 函数用于将单词转换为数字

定义名为‘words’的向量,其中包含数字的英文表示。同时,定义‘max_digits’来存储字符串的任意排列中的最大单词数。此外,定义‘digit_freq’映射来存储当我们可以从任意排列中提取最大单词时,每个数字的频率。

使用sort()方法对给定的字符串进行排序。

使用 next_permutations() 方法与 do-while() 循环。在循环中,使用另一个循环来迭代单词向量。

计算当前排列中每个单词的出现次数,并根据此更新’word_freq’映射。同时,将结果值添加到’cnt’变量中。

如果‘cnt’的值大于‘max_digits’,则更新‘max_digits’和‘digit_frequancy’的值。

遍历“digit_freq”映射并将数字转换为字符串。

示例

#include #include #include #include #include using namespace std;//  function to count the total number of occurrences of a word in a stringint countOccurrences(const string &text, const string &word){   int count = 0;   size_t pos = 0;   while ((pos = text.find(word, pos)) != std::string::npos){      count++;      pos += word.length();   }   return count;}string convertToDigits(string str){   // defining the words vector   vector words = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};   int max_digits = 0;   map digit_freq;   // Traverse the permutations vector   sort(str.begin(), str.end()); // Sort the string in non-decreasing order   do{      string temp = str;      int cnt = 0;      map word_freq;      // Traverse the words vector      for (int j = 0; j  max_digits){         max_digits = cnt;         digit_freq = word_freq;      }   } while (next_permutation(str.begin(), str.end()));   string res = "";   // Traverse the digit_freq map   for (auto it = digit_freq.begin(); it != digit_freq.end(); it++){      int digit = it->first;      int freq = it->second;      // Append the digit to the result string      for (int i = 0; i < freq; i++){         res += to_string(digit);      }   }   return res;}int main(){   string str = "zeoroenwot";   // Function Call   cout << "The string after converting to digits and sorting them in non-decreasing order is " << convertToDigits(str);}

输出

The string after converting to digits and sorting them in non-decreasing order is 012

时间复杂度 – O(N*N!),因为我们需要找到所有的排列。

空间复杂度 – O(N),用于存储最终的字符串。

方法二

这种方法是上述方法的优化版本。在这里,我们将从每个单词中取一个唯一的字符,并根据这个字符从给定的字符串中找到确切的单词。

观察

我们在‘zero’中有‘z’个独特的。

我们在‘two’中有‘w’个唯一的。

我们在’four’中有’u’个独特的。

我们在‘六’中有‘x’个独特的。

我们在‘eight’中有‘gg’个独特的。

我们可以从“three”中提取出包含“h”的所有唯一单词,就像我们上面考虑的那样。

我们可以从“one”中取出唯一的“o”,因为我们已经考虑了所有包含“o”的单词。

我们可以从“five”中选择‘f’作为所有包含‘f’的单词,如上所述。

我们在“seven”中有‘v’个独特的。

我们可以从“nine”中取出‘i’作为我们上面考虑过的所有包含‘i’的单词。

算法

定义包含英语单词的’words’向量,并确保按照下面的示例顺序进行,因为我们已经相应地考虑了唯一的单词。同时,定义一个唯一字符的向量及其数字表示

统计每个字符的频率并将其存储在映射中。

遍历唯一字符的数组

如果地图中包含当前唯一的字符,则将其频率值存储在’cnt’变量中。

现在,遍历当前单词。在地图中将单词的每个字符的频率减少’cnt’。

在‘digits’向量中添加一个单词,重复‘cnt’次。

对数字字符串进行排序,并从函数中返回。

示例

#include #include #include #include using namespace std;string convertToDigits(string str){   // store the words corresponding to digits   vector words = { "zero", "two", "four", "six", "eight", "three", "one", "five", "seven", "nine" };   // store the unique characters of the words   vector unique_chars = {'z',  'w', 'u', 'x', 'g', 'h', 'o', 'f', 'v', 'i'};   // store the digits corresponding to the words   vector numeric = {0, 2, 4, 6, 8, 3, 1, 5, 7, 9};   // to store the answer   vector digits = {};   // unordered map to store the frequency of characters   unordered_map freq;   // count the frequency of each character   for (int i = 0; i < str.length(); i++){      freq[str[i]]++;   }   // Iterate over the unique characters   for (int i = 0; i < unique_chars.size(); i++){      // store the count of the current unique character      int cnt = 0;      // If the current unique character is present, store its count. Otherwise, it will be 0.      if (freq[unique_chars[i]] != 0)          cnt = freq[unique_chars[i]];      // Iterate over the characters of the current word      for (int j = 0; j < words[i].length(); j++){          // Reduce the frequency of the current character by cnt times in the map          if (freq[words[i][j]] != 0)             freq[words[i][j]] -= cnt;      }      // Push the current digit cnt times in the answer      for (int j = 0; j < cnt; j++)         digits.push_back(numeric[i]);   }   // sort the digits in non-decreasing order   sort(digits.begin(), digits.end());   string finalStr = "";   // store the answer in a string   for (int i = 0; i < digits.size(); i++)     finalStr += to_string(digits[i]);         return finalStr;}int main(){   string str = "zoertowxisesevn";   // Function Call   cout << "The string after converting to digits and sorting them in non-decreasing order is " << convertToDigits(str);}

输出

The string after converting to digits and sorting them in non-decreasing order is 0267

时间复杂度 – O(N),其中N是字符串的长度。

空间复杂度 – O(N),用于存储最终的字符串。

以上就是重新排列字符串的字符,以形成有效的英文数字表示形式的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1445655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 22:43:32
下一篇 2025年12月14日 06:58:50

发表回复

登录后才能评论
关注微信