检查一个字符串是否可以通过交换二进制字符串中具有不相等字符的索引处的字符对来形成回文字符串

检查一个字符串是否可以通过交换二进制字符串中具有不相等字符的索引处的字符对来形成回文字符串

问题陈述

我们有一个字符串str和一个二进制字符串B。两个字符串的长度都等于N。我们需要检查是否可以通过在字符串B中包含不相等字符的任意索引对上多次交换其字符,使字符串str成为回文字符串。

示例示例

输入

  1. str = AAS B = 101

登录后复制

输出

  1. YES

登录后复制

Explanation

的中文翻译为:

解释

我们可以交换str[1]和str[2],因为B[1]和B[2]不相等。最终的字符串可以是’ASA’。

输入

  1. str = AASS B = 1111

登录后复制

输出

  1. No

登录后复制登录后复制

Explanation

的中文翻译为:

解释

我们无法使字符串回文,因为字符串B不包含不相等的字符。

输入

  1. str = AASSBV B = 111100

登录后复制

输出

  1. No

登录后复制登录后复制

Explanation

的中文翻译为:

解释

由于字符频率不匹配,我们无法使字符串str成为回文。

方法一

在第一种方法中,我们将检查是否可以使用字符串str的所有字符创建任何回文字符串。如果是,我们可以检查是否可以交换字符串B中包含不相等字符的索引对中的字符,并使字符串成为回文。否则,我们返回false。

算法

步骤 1 – 执行 utility() 函数,根据给定条件交换字符来判断字符串是否可以通过交换字符成为回文。

第二步 – 定义canBePalindromic()函数来检查我们是否可以使用str的字符来构造任何回文字符串。

步骤 2.1 − 创建一个映射,用于存储字符串 str 中每个字符及其频率。使用 for 循环遍历字符串并计算字符的频率。

第2.2步 – 计算具有偶数和奇数频率的字符数量。

步骤 2.3 – 使用 set 来获取字符串中唯一字符的总数。

步骤 2.4 − 如果字符串长度为奇数并且只包含一个具有奇数频率的字符,则返回 true。

步骤 2.5 − 如果字符串长度为偶数,则所有具有偶数频率的字符,以及0个具有奇数频率的字符,返回true。

步骤 2.6 − 返回 false。

第三步 – 如果字符串不能成为回文,返回false。

第四步 – 如果字符串B中包含多个’1’和’0’,则返回true;否则,返回false。

Example

  1. #include using namespace std;// function to check if the string can be palindromicbool canBePalindromic(string str){ //Creating the map to store the frequency of each character map charMap; // store the frequency of each character of string Str for (int i = 0; i set; //Insert all characters of string Str in set for (int i = 0; i = 1 && zero >= 1){ return true; } else { return false; } }}int main(){ string S = "NANA"; string B = "0001"; bool result = utility(S, B); if (result) cout

    输出

    Yes
  2. 登录后复制

  3. 时间复杂度 - O(NlogN),因为我们使用for循环遍历字符串,并且setinsert()方法需要(logN)的时间。

  4. 空间复杂度 - O(K),其中K是唯一字符的总数。

  5. 方法二

  6. 在这种方法中,我们将使用一个数组来存储字符的频率,而不是使用一个映射。

  7. 算法

  8. 步骤 1 - 创建一个长度为26'charFrequancy'数组,并初始化为零。

  9. 第二步 - 计算字符串B中的10的总数。

  10. 第三步 - 更新数组中每个字符的频率。

  11. 第四步 - 如果字符串长度为偶数且奇数频率不为零,则返回false

  12. 步骤5 - 如果字符串长度为奇数且奇数频率大于1,则返回false

  13. 步骤 6 - 如果字符串中同时存在 1 0,则返回 true

  14. 7 - 返回 false

  15. Example

  16. #include using namespace std;// function to check if the given string can be converted to a palindromebool utility(string str, string B){   // array to store character counts in str   int charFrequancy[26] = {0};   int ones = 0, zeros = 0, odd_fre = 0;   // count ones and zeros   for (char ch : B) {      if (ch == '1')         ones++;      if (ch == '0')         zeros++;   }   // store counts of characters   for (char ch : str){      charFrequancy[ch - 'A']++;   }   // check total character with odd frequency   for (int i = 0; i  1)      return false;   if (ones > 0 && zeros > 0)      return true;   return false;}int main(){   string S = "NBCNB";   string B = "01010";   if (utility(S, B)){      cout 

    输出

    Yes
  17. 登录后复制

  18. 时间复杂度 - O(N),因为我们使用for循环来遍历字符串。

  19. 空间复杂度 O(1),因为我们始终使用长度为26的数组。

  20. 结论

  21. 我们学习了两种方法来检查字符串是否可以通过根据给定条件交换字符而成为回文。第一种方法使用集合和映射,而第二种方法仅使用数组来存储数据。第二种方法比第一种方法更好,因为insert()方法在集合中插入数据需要O(logn)的时间,而数组只需要O(1)的时间。

  22. 以上就是检查一个字符串是否可以通过交换二进制字符串中具有不相等字符的索引处的字符对来形成回文字符串的详细内容,更多请关注【创想鸟】其它相关文章!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
编程技术

系统级异常和应用程序级异常之间的区别。

2025-3-6 14:44:53

编程技术

解释C语言中变量的生命周期

2025-3-6 14:44:59

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
私信列表
搜索