我写了下面的代码来删除给定字符串中的重复项,即如果ARRUN是输入,那么输出将是ARUN。
#include <bits/stdc++.h>
using namespace std;
char* removeDuplicates(string &s,int n){
char arr[n];
unordered_map<char,int> exists;
int index = 0;
for(int i=0;i<n;i++){
if(exists[s[i]]==0)
{
arr[index++] = s[i];
exists[s[i]]++;
}
}
return arr;
}
//driver code
int main(){
string str;
cin >> str;
cout<<removeDuplicates(str,str.length())<<endl;
return 0;
}
这段代码根本不产生任何输出,但是,如果我使用char arr[]
而不是string类,它就能正常工作。
8条答案
按热度按时间ikfrs5lh1#
如果没有
n
常量或constexpr
,就不能使用char arr[n]
。您不需要
map
。set
就足够了。请注意,
map
和set
已经删除了重复项,然后可以检查是否插入了任何元素,以使新字符串与第一个字符串的顺序相同,如下所示8cdiaqws2#
std::string
支援移除元素。tcbh2hod3#
如果函数声明如下所示
那么它意味着传递的对象本身将在函数中被改变。否则参数应该有限定符const。
此外,还不清楚为什么函数具有返回类型
char *
。看起来函数的声明是矛盾的。函数的第二个参数应至少具有
size_t
类型或更好的std::string::size_type
类型。int类型无法容纳std::string::size_type类型的所有值。可以在没有第二个参数的情况下声明函数。
一种不使用需要动态内存分配的中间容器的简单方法如下所示
程序输出为
a5g8bdjr4#
@Arun Suryan:您说对了,但是您可以不使用向量,使用全局字符数组来完成
另外,不要忘记在末尾附加
newline
!下面是一个例子:
vxbzzdmp5#
对于C++新手来说,这可能有点高级,但另一种解决方案利用了erase-remove idiom:
它基本上使用一个集合来存储已经看到的字符,将要删除的字符向下移动到尾部(使用
std::remove_if
),并从字符串中擦除尾部。工作版本here。
42fyovps6#
这也是可行的,一个具有内置功能的单线解决方案。
cout<<str.erase(std::unique(str.begin(), str.end()), str.end());
rjjhvcjd7#
简单答案
f0brbegy8#
所以,在网上读了一些东西之后,我意识到我试图在
removeDuplicates()
函数中返回一个指向本地数组的指针。这是工作正常的方法
PS:我们也可以把函数的返回类型设置为向量。