给定一个字符串,我如何才能将另一个字符串中的唯一字符添加到它?
Given a string, how can I add only unique characters from another string to it?
几个小时以来我一直在尝试许多不同的事情,我尝试使用 std::unique 但我得到的结果很奇怪,然后我尝试使用 字符串::查找。
我觉得如果我使用 std::vector 会很容易做到这一点
我正在寻找一种使用标准库执行此操作的有效方法,虽然我阅读了此处的很多问题以及关于此主题的 cpluplus.com,但我无法使用他们的答案来实现我需要的内容。如果这是微不足道的,我深表歉意,但此时我已经厌倦了尝试不同的事情。
例如:
int main(){
std::string unique_chars;
std::string new_string = "ABC"
getUniqueChars(unique_chars, new_string);
cout << unique_chars << endl;
new_string = "ABDF"
getUniqueChars(unique_chars, new_string);
cout << unique_chars;
return 0;
}
void getUniqueChars(string &unique_chars, string &new_string){
//add only unique characters from new_string to unique_chars
return;
}
应该输出:
ABC
ABCDF
这是一个指南。你必须做这份工作
- 然后连接两个字符串
- 删除重复项
这是删除重复项的方法
std::sort(str.begin(), str.end());
str.erase(std::unique(str.begin(), str.end()), str.end());
您可以使用 std::set
来完成。将两个字符串中的所有字符添加到集合中,然后从集合中创建一个新字符串。
// Create a set of characters from `unique_str`
std::set<char> set(unique_chars.begin(), unique_chars.end());
// Insert the characters from `new_string`
set.insert(new_string.begin(), new_string.end());
// The set now contains only unique characters from both strings, no duplicates
// Convert back to a string
unique_chars = std::string(set.begin(), set.end());
如果您有支持 C++11 的编译器和标准库,并且不想对结果进行排序,那么您可以改用 std::unordered_set
。
我想,一种方法是:
Algorithm:
根据每个字符将原始字符串散列到散列表中。
从新字符串中取出每个字符并检查哈希表桶是否已被标记。
如果没有标记,将其附加到原始字符串,否则拒绝它。
Code(not tested):
string orig, new ;
char arr[26]={initialise with all alphabets}
for(int i=0;i<orig.size();i++)
arr[new[i]] = x;
for(int i=0;i<new.size();i++)
if(arr[new[i]] != x)
orig += new[i];
复杂度(对于预处理)为 O(N),即与原始数组长度成线性关系。
几个小时以来我一直在尝试许多不同的事情,我尝试使用 std::unique 但我得到的结果很奇怪,然后我尝试使用 字符串::查找。 我觉得如果我使用 std::vector 会很容易做到这一点 我正在寻找一种使用标准库执行此操作的有效方法,虽然我阅读了此处的很多问题以及关于此主题的 cpluplus.com,但我无法使用他们的答案来实现我需要的内容。如果这是微不足道的,我深表歉意,但此时我已经厌倦了尝试不同的事情。
例如:
int main(){
std::string unique_chars;
std::string new_string = "ABC"
getUniqueChars(unique_chars, new_string);
cout << unique_chars << endl;
new_string = "ABDF"
getUniqueChars(unique_chars, new_string);
cout << unique_chars;
return 0;
}
void getUniqueChars(string &unique_chars, string &new_string){
//add only unique characters from new_string to unique_chars
return;
}
应该输出:
ABC
ABCDF
这是一个指南。你必须做这份工作
- 然后连接两个字符串
- 删除重复项
这是删除重复项的方法
std::sort(str.begin(), str.end());
str.erase(std::unique(str.begin(), str.end()), str.end());
您可以使用 std::set
来完成。将两个字符串中的所有字符添加到集合中,然后从集合中创建一个新字符串。
// Create a set of characters from `unique_str`
std::set<char> set(unique_chars.begin(), unique_chars.end());
// Insert the characters from `new_string`
set.insert(new_string.begin(), new_string.end());
// The set now contains only unique characters from both strings, no duplicates
// Convert back to a string
unique_chars = std::string(set.begin(), set.end());
如果您有支持 C++11 的编译器和标准库,并且不想对结果进行排序,那么您可以改用 std::unordered_set
。
我想,一种方法是:
Algorithm:
根据每个字符将原始字符串散列到散列表中。
从新字符串中取出每个字符并检查哈希表桶是否已被标记。
如果没有标记,将其附加到原始字符串,否则拒绝它。
Code(not tested):
string orig, new ;
char arr[26]={initialise with all alphabets}
for(int i=0;i<orig.size();i++)
arr[new[i]] = x;
for(int i=0;i<new.size();i++)
if(arr[new[i]] != x)
orig += new[i];
复杂度(对于预处理)为 O(N),即与原始数组长度成线性关系。