目录
问题陈述
示例示例
输入
输出
Explanation
解释
方法一
算法
Example
方法二
结论
首页 后端开发 C++ 检查一个字符串是否可以通过交换二进制字符串中具有不相等字符的索引处的字符对来形成回文字符串

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

Sep 02, 2023 pm 08:09 PM
二进制字符串 交换 回文字符串

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

问题陈述

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

示例示例

输入

str = ‘AAS’ B = ‘101’
登录后复制

输出

‘YES’
登录后复制

Explanation

的中文翻译为:

解释

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

输入

str = ‘AASS’ B = ‘1111’
登录后复制

输出

‘No’
登录后复制
登录后复制

Explanation

的中文翻译为:

解释

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

输入

str = ‘AASSBV’ B = ‘111100’
登录后复制

输出

‘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

#include <bits/stdc++.h>
using namespace std;
// function to check if the string can be palindromic
bool canBePalindromic(string str){
   //Creating the map to store the frequency of each character
   map<char, int> charMap;
   // store the frequency of each character of string Str
   for (int i = 0; i < str.length(); i++) {
      charMap[str[i]] += 1;
   }
   // to store the count of even and odd frequent characters
   int even = 0, odd = 0;
   // iterate through the map
   for (auto e : charMap)  {
      //If frequency is odd, increment odd count; else, increment even count
      if (e.second % 2 == 1) {
         odd++;
      } else {
         even++;
      }
   }
   // set to store unique characters of string Str
   unordered_set<char> set;
   //Insert all characters of string Str in set
   for (int i = 0; i < str.size(); i++){
      set.insert(str[i]);
   }
   // if the string length is odd and only one character has an odd frequency, return true
   if (str.size() % 2 == 1 && even == set.size() - 1 && odd == 1){
      return true;
   }
   // If the string length is even and all characters have even frequency, return true
   if (str.size() % 2 == 0 && even == set.size() && odd == 0){
      return true;
   }
   // else return false
   return false;
}
// function to check if the string can be palindromic by swapping characters according to string B
bool utility(string S, string B){
   // If string S cannot be palindromic, return false.
   if (canBePalindromic(S) == false){
      return false;
   } else{
      // if at least one '1' and '0' is present in string B, string S can be palindromic
      int one = 0, zero = 0;
      for (int i = 0; i < B.size(); i++) {
         // If the current character is '0.'
         if (B[i] == '0'){
            zero++;
         } else {
            one++;
         }
      }
      // return true if at least one '1' and '0' is present in the string B
      if (one >= 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";
   else
      cout << "No";
   return 0;
}
登录后复制

输出

Yes
登录后复制
登录后复制
  • 时间复杂度 - O(NlogN),因为我们使用for循环遍历字符串,并且set的insert()方法需要(logN)的时间。

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

方法二

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

算法

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

  • 第二步 - 计算字符串B中的1和0的总数。

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

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

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

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

  • 第7步 - 返回 false。

Example

#include <bits/stdc++.h>
using namespace std;
// function to check if the given string can be converted to a palindrome
bool 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 < 26; i++){
      if (charFrequancy[i] % 2 == 1)
         odd_fre++;
   }
   if (str.length() % 2 == 0 && odd_fre != 0)
      return false;
   if (str.length() % 2 == 1 && odd_fre > 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";
   } else {
      cout << "No";
   }
   return 0;
}
登录后复制

输出

Yes
登录后复制
登录后复制
  • 时间复杂度 - O(N),因为我们使用for循环来遍历字符串。

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

结论

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

以上是检查一个字符串是否可以通过交换二进制字符串中具有不相等字符的索引处的字符对来形成回文字符串的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在 Ubuntu 上添加交换空间 22.04 LTS 如何在 Ubuntu 上添加交换空间 22.04 LTS Feb 20, 2024 am 11:12 AM

交换空间在Linux系统中扮演着重要角色,特别是在系统内存不足时。它充当着一个备用的内存存储空间,可以帮助系统平稳运行,即使在负载高的情况下也能保持稳定性。本文为您提供了在Ubuntu22.04LTS上添加交换空间的详细指南,以确保您的系统性能得到优化并能应对各种工作负载。了解交换空间交换空间提供虚拟内存,用于补充系统的物理RAM。当系统的RAM不足时,内核会将数据交换到磁盘,以防止内存不足和系统崩溃。Linux系统常用交换空间来处理这种情况。同时运行多个内存密集型应用程序处理非常大的文件或数据

最长非递增子序列在一个二进制字符串中 最长非递增子序列在一个二进制字符串中 Sep 07, 2023 pm 11:13 PM

在这个问题中,我们需要找到给定字符串的最长非递增子序列。非递增的意思是字符要么相同,要么按降序排列。由于二进制字符串仅包含“0”和“1”,因此生成的字符串应以“1”开头并以“0”结尾,或者以“0”或“1”开头和结尾。为了解决这个问题,我们将统计字符串每个位置的前缀“1”和后缀“0”,并找到前缀“1”和后缀“0”的最大和。问题陈述-我们给出了二进制字符串str。我们需要从给定的字符串中找到最长的非递增子序列。示例Input–str="010100"Output–4说明最长的非递

Python程序:交换矩阵中第一个和最后一个元素在列之间的位置 Python程序:交换矩阵中第一个和最后一个元素在列之间的位置 Sep 08, 2023 pm 04:29 PM

矩阵是由许多按行和列形式排列的数字组成的二维数组。Python没有任何数据类型来表示矩阵,但我们可以使用嵌套列表或NumPy数组作为矩阵。请参阅以下输入输出场景,了解如何互换矩阵的第一列和最后一列元素。输入输出场景假设我们有一个使用列表列表表示的3X3矩阵。输出矩阵将是交换第一列和最后一列元素的结果矩阵。Inputmatrix:[1,3,4][4,5,6][7,8,3]Outputmatrix:[4,3,1][4,5,6][3,8,7]让我们考虑另一个行和列不相等的矩阵。Inputmatrix:

使用C++编写,找到以1开头的二进制字符串的唯一排列数量 使用C++编写,找到以1开头的二进制字符串的唯一排列数量 Sep 05, 2023 am 09:01 AM

在给定的问题中,我们得到一个由0和1组成的字符串;我们需要找到以1开头的所有排列的总数。由于答案可能是一个巨大的数字,所以我们将其取模1000000007后输出。Input:str="10101001001"Output:210Input:str="101110011"Output:56我们将通过应用一些组合数学和建立一些公式来解决这个问题。解决方案的方法在这个方法中,我们将计算0和1的数量。现在假设n是我们字符串中出现的1的数量,m是我们字符串中出现的0

在PHP中,pack()函数的作用是将数据转换为二进制字符串 在PHP中,pack()函数的作用是将数据转换为二进制字符串 Aug 31, 2023 pm 02:05 PM

pack()函数将数据打包到二进制字符串中。语法pack(format,args)参数格式-要使用的格式。以下是可能的值-a-NUL填充字符串A-空格填充字符串h-十六进制字符串,低半字节在前H-十六进制字符串,高半字节在前c-带符号字符C-无符号字符s-带符号短字符(始终为16位,机器字节顺序)S-无符号短整型(始终为16位,机器字节顺序)n-无符号短整型(始终为16位,大端字节顺序)v-无符号短整型(始终为16位,小端字节顺序)i-有符号整数(取决于机器的大小和字节顺序)I-无符号整数(取决

C++程序以找出通过交换行和列可以生成的唯一矩阵的数量 C++程序以找出通过交换行和列可以生成的唯一矩阵的数量 Sep 01, 2023 am 11:53 AM

假设我们有一个nxn矩阵。矩阵中的每个元素都是唯一的,并且是1到n2之间的整数。现在我们可以以任意数量和任意顺序执行以下操作。我们选择矩阵中的任意两个整数x和y,其中(1≤x

检查一个字符串是否可以通过交换二进制字符串中具有不相等字符的索引处的字符对来形成回文字符串 检查一个字符串是否可以通过交换二进制字符串中具有不相等字符的索引处的字符对来形成回文字符串 Sep 02, 2023 pm 08:09 PM

问题陈述我们有一个字符串str和一个二进制字符串B。两个字符串的长度都等于N。我们需要检查是否可以通过在字符串B中包含不相等字符的任意索引对上多次交换其字符,使字符串str成为回文字符串。示例示例输入str=‘AAS’B=‘101’输出‘YES’Explanation的中文翻译为:解释我们可以交换str[1]和str[2],因为B[1]和B[2]不相等。最终的字符串可以是'ASA'。输入str=‘AASS’B=‘1111’输出‘No’Explanation的中文翻译为:解释我们无法使字符串回文,

计算长度为N的二进制字符串,它们是子字符串的重复拼接 计算长度为N的二进制字符串,它们是子字符串的重复拼接 Sep 07, 2023 am 10:13 AM

本文的目的是实现一个程序,用于计算由一个子字符串重复连接而成的长度为N的二进制字符串的数量。目标是确定通过重复连接给定文本的单个子字符串,可以创建多少长度为N的二进制字符串,其中N是一个正整数。问题陈述实现一个程序,用于计算重复连接子字符串的长度为N的二进制字符串的数量。示例示例1LetustaketheInput,N=3Output:2Explanation的中文翻译为:解释下面列出了长度为N=3的可行二进制字符串,其中重复连接了一个子字符串。"000":Thesubstr

See all articles