目錄
問題陳述
範例範例
輸入
輸出
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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++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系統常用交換空間來處理這種情況。同時運行多個內存密集型應用程式處理非常大的檔案或數據

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:

最長非遞增子序列在一個二進位字串中 最長非遞增子序列在一個二進位字串中 Sep 07, 2023 pm 11:13 PM

在這個問題中,我們需要找到給定字串的最長非遞增子序列。非遞增的意思是字元要麼相同,要麼按降序排列。由於二進位字串僅包含“0”和“1”,因此產生的字串應以“1”開頭並以“0”結尾,或以“0”或“1”開頭和結尾。為了解決這個問題,我們將統計字串每個位置的前綴“1”和後綴“0”,並找到前綴“1”和後綴“0”的最大和。問題陳述-我們給了二進位字串str。我們需要從給定的字串中找到最長的非遞增子序列。範例Input–str="010100"Output–4說明最長的非遞

在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++編寫,找到以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

檢查一個字串是否可以透過交換二進位字串中具有不相等字元的索引處的字元對來形成回文字串 檢查一個字串是否可以透過交換二進位字串中具有不相等字元的索引處的字元對來形成回文字串 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的中文翻譯為:解釋我們無法讓字串回文,

C++程式以找出透過交換行和列可以產生的唯一矩陣的數量 C++程式以找出透過交換行和列可以產生的唯一矩陣的數量 Sep 01, 2023 am 11:53 AM

假設我們有一個nxn矩陣。矩陣中的每個元素都是唯一的,並且是1到n2之間的整數。現在我們可以以任意數量和任意順序執行以下操作。我們選擇矩陣中的任兩個整數x和y,其中(1≤x

找到在將一個二進位字串清空(透過移除非空子字串)後,0的數量最少的玩家 找到在將一個二進位字串清空(透過移除非空子字串)後,0的數量最少的玩家 Sep 16, 2023 am 10:21 AM

在本文中,我們將討論一個有趣的問題,涉及字串操作和博弈論領域:「透過刪除非空子字串來清空二進位字串,找到剩餘0最少的玩家」。這個問題探索了使用二進位字串進行競技遊戲的概念。我們的目標是在遊戲結束後找出剩餘0最少的玩家。我們將討論這個問題,提供一個C++程式碼實現,並透過一個例子來解釋這個概念。理解問題陳述給兩個玩家一個二進位字串,他們輪流玩遊戲。在每一回合中,玩家移除至少包含一個「1」的非空子字串。當字串變空或字串中沒有“1”時,遊戲結束。無法採取行動的玩家輸掉遊戲。任務是找到最終0

See all articles