C++程序从字符矩阵中删除行或列重复项
我们得到一个具有行和列的二维矩阵。该矩阵由char数据类型的元素组成。设计了一种方法来删除在其各自的行或列中重复的元素。
在这种方法中,我们检查每个字符是否在其行或列中重复。如果它没有重复,我们保持它与之前一样。
我们可以将每行和每列中出现的数值存储在一个映射中。之后,我们可以再次遍历并获取那些仅在其行和列中出现一次的数值。这将需要额外的空间,并且我们可以通过在其行和列中搜索每个元素来进行时空权衡。我们使用了一个映射来存储字符和计数。
vector<vector<char>> arr = { {'A', 'B', 'E', 'G', 'L'}, {'K', 'M', 'P', 'Q', 'S'}, {'V', 'W', 'T', 'B', 'O'}, {'K', 'H', 'O', 'U', 'P'}, {'P', 'I', 'C', 'Y', 'J'}, {'F', 'S', 'K', 'E', 'W'}, {'N', 'L', 'Y', 'G', 'O'}, }; res = solve(arr);
示例(使用Vector ADT)
假设我们有一个包含以下字符的矩阵:
A C E G I
K M O Q S
U W Y B D
K H I N P
R T W X Z
A E I M Q
L O P G A
这里,对于矩阵的第一行,我们不能考虑'A'和'G',因为它们在各自的列中出现了两次,但我们可以考虑'C','E','I'。以下是上述示例的C++程序:
#include <iostream> #include <vector> #include <map> using namespace std; void solve(vector<vector<char>>& arr) { vector<map<char, int>> rows(arr.size()), columns(arr[0].size()); for(int i=0;i<arr.size();i++) { for(int j=0;j<arr[i].size();j++) { rows[i][arr[i][j]]++; columns[j][arr[i][j]]++; } } for(int i=0;i<arr.size();i++) { for(int j=0;j<arr[i].size();j++) { if(rows[i][arr[i][j]] == 1 && columns[j][arr[i][j]] == 1) { cout << arr[i][j]; } } } } int main() { vector<vector<char>> arr = { {'A', 'C', 'E', 'G', 'I'}, {'K', 'M', 'O', 'Q', 'S'}, {'U', 'W', 'Y', 'B', 'D'}, {'K', 'H', 'I', 'N', 'P'}, {'R', 'T', 'W', 'X', 'Z'}, {'A', 'E', 'I', 'M', 'Q'}, {'L', 'O', 'P', 'G', 'A'}, }; solve(arr); return 0; }
输出
CEIMOQSUWYBDHNPRTWXZEMQLOPA
示例(不使用Vector ADT)
#include <bits/stdc++.h> using namespace std; int main() { int row = 2, column = 8; const char* input_array[] = { "ABCDPQST", "ECFDOMUT" }; bool boolean_array[row][column]; memset(boolean_array, 0, sizeof(boolean_array)); for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { for (int k = 0; k < column; k++) { if (input_array[i][j] == input_array[i][k] && j != k) { boolean_array[i][j] = true; boolean_array[i][k] = true; } } for (int k = 0; k < row; k++) { if (input_array[i][j] == input_array[k][j] && i != k) { boolean_array[i][j] = true; boolean_array[k][j] = true; } } } } for (int i = 0; i < row; i++) for (int j = 0; j < column; j++) if (!boolean_array[i][j]) printf("%c ", input_array[i][j]); return 0; }
输出
A B C P Q S E C F O M U
结论
我们使用了O(n^2)的复杂度。对于只有小写拉丁字符的情况,映射的log(n)复杂度可以忽略不计,因为只有26个字符。但是对于更多随机字符的字符,这可能会起作用。您可以尝试自己不使用哈希和额外空间来解决此问题。
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP