C++ 修改字符串数组,将在同一个字符串或剩余字符串中重复出现的字符替换掉
通过替换在同一个字符串或剩余字符串中重复出现的字符来修改字符串数组是编程中常见的问题。可以使用哈希表、集合、数组等方法来解决。目标是提高时间和空间需求,同时提供相同的功能。这个问题在许多实际场景中会遇到,比如处理大文本或清理包含重复数据的数据集。
问题陈述
给定一个包含小写字母和大写字母的输入字符串数组arr[]。目标是通过从字符串中移除在同一个字符串或另一个字符串中重复出现的字符来修改数组。
示例1
输入
arr[] = {“apple”, “Banana”, “coding”}
输出
arr[] = {“aple”, “Bn”, “codig”}
解释
对于arr[0] = “apple”,字符串中只有字符’p’重复,因此修改后的arr[0] = “aple”
对于arr[1] = “Banana”,字符’a’和’n’都重复,因此修改后的arr[1] = “Bn”
对于arr[2] = “coding”,字符’n’重复,因此修改后的arr[2] = “codig”
示例2
输入
arr[] = {“Stay”, “This”, “Hill”}
输出
arr[] = {“Stay”, “This”, “Hl”}
解释
对于arr [0] =“Stay”,没有重复字符,因此修改后的arr [0] =“Stay”
对于arr [1] =“This”,没有重复字符,因此修改后的arr [1] =“This”
对于arr [2] =“Hill”,字符“ i”和“ l”重复出现,因此修改后的arr [2] =“Hl”
方法:使用集合
为了删除给定字符串数组中的重复字符,可以使用集合。可以使用无序集合来记录遍历字符串数组时遇到的不同字符。在数组中对每个字符串进行迭代,然后对字符串中的每个字符进行迭代,检查集合中每个字符的出现情况,如果存在,则将该字符添加到集合中并追加修改后的字符串,否则跳过。
步骤
这是给定C++程序的算法−
- 定义一个名为 removeDuplicates 的函数,它接受一个字符串向量 arr 作为输入。
-
声明一个无序字符集合 uniqueChar ,用于存储不同的字符。
-
确定数组的大小 n 。
-
声明一个空的字符串向量 ans ,用于存储修改后的字符串列表。
-
使用for循环遍历数组,并遍历 arr 中的每个字符串 str 。
-
声明一个空字符串 temp ,用于存储修改后的字符串。
-
使用for循环遍历 str 中的每个字符 ch 。
-
如果 ch 已经在 uniqueChar 中存在,则继续到下一个字符。
-
否则,将 ch 添加到 temp 中,并将 ch 插入到 uniqueChar 中。
-
如果 temp 不是空字符串,则将其推入向量 ans 中。
-
使用for循环遍历向量 ans ,并打印每个字符串。
-
在 main 函数中,定义一个字符串数组 arr ,并给出输入的字符串。
-
调用 removeDuplicates 函数,将 arr 作为输入。
示例:C++实现
在下面的程序中,我们使用无序集合来跟踪字符串数组中的所有唯一字符。首先检查每个字符是否在集合中出现过,并根据这个判断是否将其保留在修改后的字符串中。
#include <bits/stdc++.h>
using namespace std;
// Function to remove duplicate characters across the strings
void removeDuplicates(vector<string> arr){
// Unordered set stores the unique characters in the given array of strings
unordered_set<char> uniqueChar;
int n = arr.size();
vector<string> ans;
// traversing the array to get all the strings individually
for (auto str : arr) {
string temp = "";
// Iterating over the characters of the string
for (auto ch : str) {
// If character has not occurred before and is not present in the set
if (uniqueChar.find(ch) == uniqueChar.end()) {
// Adding the character to the modified string and the set
temp += ch;
uniqueChar.insert(ch);
}
// If ch is present in the set then it had occurred before thus just skip it
}
ans.push_back(temp);
}
// Printing the list of modified strings
for (int i = 0; i < ans.size(); i++) {
cout << ans[i] << " ";
}
}
int main(){
vector<string> arr= { "Stay", "This", "Hill" };
removeDuplicates(arr);
}
输出
Stay This Hl
时间复杂性 - O(nm),其中n是输入数组的大小,m是最大字符串的大小。
空间复杂性 - O(n)
结论
总之,我们可以通过一个简单的算法将字符串数组中重复的字符替换掉来修改。我们可以使用一个集合来存储不同的字符。该算法效率高,时间复杂度为O(nm),但可以通过以下优化进一步提高效率:
-
将向量传递给引用而不是值,以避免复制整个向量。
-
在迭代向量时使用常量引用,以避免复制每个元素。