摘要: 简单哈希表的使用。
题目 描述 编写一个函数,计算字符串中含有的不同字符的个数。字符在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 #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 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()); } }