VIRTUALS

the virtual labs for the virtuals

0%

HJ10. 字符个数统计

摘要:
简单哈希表的使用。

题目

描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在ASCII码范围内($0$~$127$,包括 $0$ 和 $127$),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串abaca而言,有a、b、c三种不同的字符,因此输出 $3$。

输入描述:
输入一行没有空格的字符串。

输出描述:
输出 输入字符串 中范围在($0$~$127$,包括 $0$ 和 $127$)字符的种数。

示例1

输入:
abc

输出:
3

哈希表

很容易想到维护一个哈希表或者集合统计所有出现过的字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h>

using namespace std;

unordered_map<int, bool> st;

int main()
{
string s;
cin >> s;
for (int i = 0, n = s.size(); i < n; i++) {
st[s[i]] = true;
}
cout << st.size() << endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
Map<Character, Boolean> hash = new HashMap<>();
char[] chs = s.toCharArray();
for (int i = 0, n = chs.length; i < n; i++) {
hash.put(chs[i], true);
}
System.out.println(hash.size());
}
}

bitset

当然也可以使用bitset记录所有出现过的字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
* author: etoa
* 2021-08-17 23:15:54
*/
#include <bits/stdc++.h>

using namespace std;

int main()
{
string s;
cin >> s;
bitset<130> bs;
for (int i = 0, n = s.size(); i < n; i++) {
bs[s[i]] = true;
}
cout << bs.count() << endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
* author: etoa
* 2021-08-17 23:13:16
*/
import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
BitSet bitset = new BitSet(130);
char[] chs = s.toCharArray();
for (int i = 0, n = chs.length; i < n; i++) {
bitset.set(chs[i]);
}
System.out.println(bitset.cardinality());
}
}

原题链接: HJ10. 字符个数统计