这是我的代码:
#include <iostream>
#include <string>
using namespace std;
void calc(string s){
for(int i = 0;i < s.size();++i){
int count = 1;
for(int j = i + 1;j <s.size();++j){
if(s[i] == s[j]){
count += 1;
}
}
cout << s[i] <<"(" << count << ")" << " ";
}
}
int main(){
string str;
while(cin >> str){
calc(str);
}
}
一切正常,除了我想迭代字符串中的唯一字符,我不知道如何实现它。 你能帮帮我吗?
答案 0 :(得分:1)
有很多方法可以做到这一点。以下是一些建议:
修改您编写的代码,以便在计算字符在当前字符之后出现的次数之前,首先扫描字符串中的字符,看看它们中是否有匹配。如果是,请跳过当前字符。
每次找到与当前字符匹配的字符时,请将其替换为字符串中第一个字符的副本。然后,每当您访问字符串中不在第一个位置的字符时,请检查它是否与字符串中的第一个字符匹配。如果是这样,你已经扫描过了。如果没有,请计算其出现次数。
维护将字符映射到其频率的辅助数据结构(数组,哈希表等)。通过对原始字符串进行一次传递来填写表格,然后遍历具有唯一键的表格,以打印出所有内容。
对字符串进行排序。计算每个字符出现的次数,然后归结为查找字符串中每个连续字符的长度。
如果您不能修改原始字符串并且不允许使用其他数据结构,则选项(1)是好的。如果允许修改原始字符串,则选项(2)具有出色的时间和空间要求。选项(3)可能是最容易编码的,但比其他方法使用更多的空间。选项(4)也很容易编码,如果你使用像heapsort这样的东西,它具有良好的内存使用率,但仍然比选项(2)渐近地慢。
答案 1 :(得分:0)
为什么不保持26长度的辅助数组,将其初始化为0,然后每次遇到一个字符时将相应的索引值增加1?
伪代码:
auxArray[26] = [0] // 26 length array initialized to zero
for character in string: // loop through every character in the string
auxArray[character - 'a']++; //increment the corresponding index value by 1
print auxArray //print the entire array. [0] will give you count of 'a', and [25] will give you count of 'z'
这假设你有一个从'a'到'z'的字符串(全部小写)。
如果我们也有一个大写 - 小写的字符混合,你可能类似的东西,但使用128的数组。在这种情况下,你不必减去'a'
因为它是正在完成以使用字符来容纳索引。
auxArray[128] = [0]
for character in string:
auxArray[character]++;
for index in auxArray:
print(((char)index) + " Count is " + auxArray[index])
答案 2 :(得分:0)
另一种方法是使用std::map
:
std::map<char,int> count;
for (int i = 0; i < s.size(); ++i)
count[s[i]]++;
for (auto iter = s.begin(); iter != s.end(); ++iter)
std::cout << iter->first << “: “ << iter->second << ‘\n’;
未经测试,抱歉。