我只是想知道是否有其他逻辑可以解决此问题:
问题:查找给定字符串中的对数,并输出所有对和未配对元素的总和。 PS:输入区分大小写。
示例O / P:
等式3
aa
2
wer
5
通过首先对输入字符串进行排序,然后比较相邻的元素,如下面的代码所示,我找到了解决此问题的方法:
int main()
{
int t,count=0,pos=0;
char swap;
char a[201];
cin>>a;
int len=strlen(a);
//cout<<a<<endl;
for (int c = 0 ; c < ( len - 1 ); c++)
{
for (int d = 0 ; d < len - c - 1; d++)
{
if (a[d] > a[d+1]) /* For decreasing order use < */
{
swap = a[d];
a[d] = a[d+1];
a[d+1] = swap;
}
}
}
//cout<<a<<endl;
count=0;
for(int i=0;i<len;){
if(a[i]==a[i+1]){
count++;
i+=2;
//if(i== len-2)i++;
}
else{ count++; i++;}
}
//if(a[len-1]!=a[len-2])count++;
cout<<count<<endl;
return 0;
}
此代码可以正常工作。但是,我只是想知道是否有其他解决此问题的有效方法,而不涉及对整个输入数组进行排序。
最佳答案
它基本上避免了基于只有256个可能字符的想法进行排序,因此足以计算它们,这是我的解决方案:
int main()
{
std::string s; std::cin >> s;
int cnt[256] = {};
for (std::size_t i = 0; i < s.size(); ++i)
++cnt[static_cast<unsigned char>(s[i])];
int sum = 0;
for (std::size_t i = 0; i < 256; ++i)
sum += cnt[i]/2 + cnt[i]%2;
std::cout << sum << std::endl;
}
例如,如果字符串包含5次
'a'
,则允许5/2对(整数除法),而1个仍未配对(因为5为奇数=> 5%2为1)编辑:因为我们在这里:
int main()
{
std::array<int, 256> cnt{-1}; // last char will be '\0', ignore this.
std::for_each(std::istreambuf_iterator<char>(std::cin.rdbuf()),
std::istreambuf_iterator<char>{},
[&](unsigned char c){++cnt[c];});
std::cout << std::accumulate(cnt.begin(), cnt.end(), 0,
[](int i, int c)->int{return i+(c/2)+(c%2);}) << '\n';
}
关于c++ - 模式匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14668222/