通过执行交换操作检查两个字符串数组是否相等
字符串数组是一个二维数组,其中存储字符。在 C++ 语言中,我们有一个内置函数,语法为 -
swap (first_datatype, second_datatype)
用于对两个元素执行交换操作,即交换它们携带的值。接下来,我们还应该对字符串元素的位置进行一些交换以获得预期的输出。但是,我们可以用更简单的方法获得输出。
问题陈述
现在,在这个问题中,我们有两个字符串数组(意思是字符数组或字符数组,而不是数字数组)。我们必须检查是否可以通过对任意二维数组的字符串频繁使用交换操作来使字符串数组相等。让我们看看应该如何解决这个问题。
示例
让我们尝试借助一些示例来理解这个问题。
输入 −
s1 = {"aachg", "klsm", "abcd", } s2 = { "aghca", "dbca", "mlks"}
输出 −
true
解释 − 如果我们交换第二个字符串'a'和'g',然后交换'c'和'h',那么第一个字符串数组 1 可以交换回"aghca"
如果我们交换'm'和's',然后交换's'和'h',那么数组 1 的第二个字符串可以转换为"mlks" 'k'
如果我们交换'd'和'a',array1 的第三个字符串可以转换为"dbca"
因此,如果我们执行所有这些交换操作,我们将获得集合 1 的数组元素与集合 2 中的所有数组元素相同。虽然两个数组中的字符串顺序或位置可能不同,但可以认为所需的字符串元素相等。
输入 −
s1 = { "bbs", "aaa", "jsk" } s2 = { "aaa", "dbs", "kjs" }
输出 −
false
解释 − 任何数量的字符串交换操作都不可能使给定的两个字符串相等
问题解释
让我们尝试理解这个问题并找到它的解决方案。如果我们想看看某些交换操作是否可以使一个字符串等于另一个字符串,并且允许执行的交换操作数量没有限制,我们可以使用一种更简单的方法来得到答案。我们可以先对每个数组中的每个字符串进行排序,然后如果我们也对两个数组进行排序,我们可以比较两个数组的相应字符串,如果每个字符串都与其他每个相应字符串相等,那么我们可以说我们可以通过执行交换操作使两个字符串数组相等。
解决方案
定义上述解决方案的算法
检查两个字符串的大小,如果它们的大小不相等,则无法使两个数组的字符串相等。
同时对数组 1 和数组 2 的字符串进行排序。
同时对两个数组进行排序。
现在,如果两个数组的字符串可以相等,它们将位于彼此对应的位置。
检查排序后的数组 1 中的每个字符串是否与数组 2 相应位置的字符串,如果是,则返回 true,否则返回 false。
示例:C++ 代码实现
#include <bits/stdc++.h> using namespace std; // 辅助函数,用于检查是否可以通过对两个数组中的任何一个执行交换操作来使两个数组相等 bool Helper(vector<string> s1, vector<string> s2){ // 如果两个数组集的大小不相同,我们将立即返回 false,因为我们无法使所有字符串相等 if(s1.size() != s2.size()){ return false; } // 存储字符串的长度 int n = s1.size(); // 开始循环对两个数组中的每个字符串进行排序 for(int i=0; i < n; i++){ // 对集合 1 的数组中索引 i 处的字符串进行排序 sort(s1[i].begin(),s1[i].end()); // 对集合 2 的数组中索引 i 处的字符串进行排序 sort(s2[i].begin(), s2[i].end()); } // 现在对两个数组进行排序,以便我们可以直接比较字符串以简化我们的处理 sort(s1.begin(), s1.end()); sort(s2.begin(), s2.end()); // 开始循环比较两个数组中存在的每个字符串 for (int i = 0; i < n; i++){ // 检查排序后集合 1 中的任何字符串是否不等于集合 2 中的相应字符串,否则就不可能使两个数组相等 if (s1[i] != s2[i]){ return false; } } // 如果集合 1 中的每个字符串都等于集合 2 中的每个相应字符串,则返回 true return true; } // main 主函数 int main(){ vector<string> s1 = {"aachg", "klsm", "abcd"}; vector<string> s2 = { "aghca", "dbca", "mlks"}; // 调用 Helper 函数获取二进制答案 true (1) 或 false (0),我们将根据该答案提供最终输出 bool output = Helper(s1, s2); if(output==0){ cout<< "False: 集合 1 中的每个字符串并非都等于集合 2 中的每个其他字符串" << endl; } else{ cout<< "True: 集合 1 中的每个字符串都等于集合 2 中的每个其他字符串" << endl; } return 0; }
输出
True:集合 1 中的每个字符串都等于集合 2 中的每个其他字符串
上述代码的复杂度
时间复杂度 - O(n*log(n)); 其中 n 是数组的大小,因为我们在这里使用了排序,我们知道内置函数"sort"的时间复杂度是"n*log(n)"
空间复杂度 - O(1); 在上述代码中,我们没有在某些数据结构中存储任何变量。
结论
在本文中,通过执行交换操作来检查两个字符串数组是否相等。我们首先会观察到,我们对实现目标所必须进行的交换次数没有任何限制。如果我们在对每个数组中的各个字符串进行排序后,通过执行交换操作使两个字符串数组相等,我们将利用这一事实使我们的问题变得稍微简单一些。如果我们也对这两个数组进行了排序,我们可以比较两个数组中相应的字符串并得出结论,我们可以这样做。