首頁 > 後端開發 > C++ > 主體

檢查是否可以透過交換字元使陣列中的所有字串相同

PHPz
發布: 2023-09-22 23:45:03
轉載
822 人瀏覽過

檢查是否可以透過交換字元使陣列中的所有字串相同

在本文中,我們將探討透過交換字元來檢查陣列中的所有字串是否相同的問題。我們將首先理解問題陳述,然後研究解決該問題的簡單和有效的方法,以及它們各自的演算法和時間複雜度。最後,我們將用 C 實作該解決方案。

問題陳述

給定一個字串數組,確定是否可以透過交換字元使所有字串都相同。

天真的方法

最簡單的方法是對數組中每個字串的字元進行排序,然後將每個已排序的字串與下一個已排序的字串進行比較。如果所有已排序的字串都相等,則表示可以透過交換字元使所有字串相同。

演算法(樸素)

  • 對陣列中每個字串的字元進行排序。

  • 將每個已排序的字串與下一個已排序的字串進行比較。

  • 如果所有已排序的字串都相等,則傳回true;否則,傳回 false。

C 程式碼(樸素)

範例

#include <iostream>
#include <vector>
#include <algorithm>

bool canBeMadeSame(std::vector<std::string> &strArray) {
   for (auto &str : strArray) {
      std::sort(str.begin(), str.end());
   }
   
   for (size_t i = 1; i < strArray.size(); i++) {
      if (strArray[i - 1] != strArray[i]) {
         return false;
      }
   }
   
   return true;
}

int main() {
   std::vector<std::string> strArray = {"abb", "bba", "bab"};
   
   if (canBeMadeSame(strArray)) {
      std::cout << "All strings can be made the same by interchanging characters." << std::endl;
   } else {
      std::cout << "All strings cannot be made the same by interchanging characters." << std::endl;
   }

   return 0;
}
登入後複製

輸出

All strings can be made the same by interchanging characters.
登入後複製
登入後複製

時間複雜度(樸素):O(n * m * log(m)),其中 n 是數組中字串的數量,m 是數組中字串的最大長度。

高效的方法

有效的方法是計算每個字串中每個字元的頻率並將計數儲存在頻率數組中。然後,比較所有字串的頻率數組。如果它們相等,則表示透過交換字元可以使所有字串相同。

演算法(高效)

  • 為數組中的每個字串初始化頻率數組向量。

  • 統計每個字串中每個字元的出現頻率,並將其儲存到對應的頻率陣列中。

  • 比較所有字串的頻率數組。

  • 如果所有頻率陣列相等,則傳回true;否則,傳回 false。

C 程式碼(高效率)

範例

#include <iostream>
#include <vector>
#include <algorithm>

bool canBeMadeSame(std::vector<std::string> &strArray) {
   std::vector<std::vector<int>> freqArrays(strArray.size(), std::vector<int>(26, 0));
   
   for (size_t i = 0; i < strArray.size(); i++) {
      for (char ch : strArray[i]) {
         freqArrays[i][ch - 'a']++;
      }
   }
   
   for (size_t i = 1; i < freqArrays.size(); i++) {
      if (freqArrays[i - 1] != freqArrays[i])
      return false;
   }
   
   return true;
}

int main() {
   std::vector<std::string> strArray = {"abb", "bba", "bab"};
   if (canBeMadeSame(strArray)) {
      std::cout << "All strings can be made the same by interchanging characters." << std::endl;
   } else {
      std::cout << "All strings cannot be made the same by interchanging characters." << std::endl;
   }
   
   return 0;
}
登入後複製

輸出

All strings can be made the same by interchanging characters.
登入後複製
登入後複製

時間複雜度(高效) - O(n * m),其中 n 是數組中字串的數量,m 是數組中字串的最大長度。

結論

在本文中,我們探討了透過交換字元來檢查陣列中的所有字串是否相同的問題。我們討論了解決這個問題的簡單而有效的方法,以及它們的演算法和時間複雜度。這種有效的方法使用頻率數組來比較字元的出現次數,與簡單的方法相比,時間複雜度有了顯著的提高。

以上是檢查是否可以透過交換字元使陣列中的所有字串相同的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:tutorialspoint.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板