判断两个字符串是否是anagram [No. 19]

本文介绍了一种使用哈希表和计数器原理来判断两个字符串是否为anagram的有效方法。首先检查两字符串长度是否相等,然后通过遍历每个字符并调整哈希表中的计数值来实现。最终所有计数值归零则表明这两个字符串互为anagram。

所谓 anagram, 就是两个词所用的字母及其个数都是一样的,但是,字母的位置不一样。比如 abcc 和 cbca 就是 anagram.判断的方法比较简单,先把单个字母(字符)转成整数,然后利用了hashtable+计数器的原理进行判断。

public static boolean anagrams(String a, String b) {
		
		if (a.length() != b.length()) return false;
		int letters[] = new int[256];
		
		//initialization
		for (int i = 0; i < letters.length; i++) {
			letters[i] = 0;
		}
		
		//process the string a
		for (char c : a.toCharArray()) {
			++letters[c]; 
		}
		
		//if the char appears in string b, decrease the corresponding number of counts.
		for (char c : b.toCharArray()) {
			if (letters[c] == 0) {
				return false;
			}
			--letters[c];
		}
		
		//if string a and b are anagrams, all the values in array letters should be 0
		for (int i = 0; i < letters.length; i++) {
			if (letters[i] != 0) {
				return false;
			}
		}	
		return true;	
	}

ASCII 表: http://www.asciitable.com/


题目描述 当且仅当 r 在词法上比 r 的反转小时,仅由小写拉丁字母组成的字符串 r 才被称为通用字符串。 给你一个由 n 个小写拉丁字母组成的字符串 s 。您需要将 s 变为通用字符串。为此,您可以对 s 执行以下操作最多 k 次: 选择两个索引 i 和 j ( 1≤i,j≤n ),然后交换 s i ​ 和 s j ​ 。注意,如果是 i=j ,则什么也不做。 判断是否可以通过执行上述操作最多 k 次,使 s 成为全等式。 ∗ 当且仅当下面的条件成立时,字符串 a 在词法上比相同长度的字符串 b 小: 在 a 和 b 不同的第一个位置上,字符串 a 的字母在字母表中出现的时间早于 b 中的相应字母。 字符串 r 的反转是将 r 从右向左书写得到的字符串。例如,字符串 abcad 的反转是 dacba 。 输入格式 每个测试包含多个测试用例。第一行包含测试用例的数量 t ( 1≤t≤500 )。测试用例说明如下。 每个测试用例的第一行包含两个整数 n 和 k ( 1≤n≤100 , 0≤k≤10 4 ) 表示字符串长度 s 和可执行的最大操作数。 第二行包含由 n 个小写拉丁字母组成的字符串 s 。 输出格式 对于每个测试用例,如果可以通过执行最多 k 次的操作来实现 s 的通用性,则打印 “YES”。否则,打印 “NO”。 样例输入 1 8 1 10000 a 3 3 rev 6 0 string 6 0 theory 9 2 universal 19 0 codeforcesecrofedoc 19 1 codeforcesecrofedoc 3 1 zzz 样例输出 1 NO YES NO YES YES NO YES NO 提示/说明 样例说明 在第一个测试案例中, s 在任何操作后都会保持不变。然而, a 的反转仍然是 a ,因此不可能使 s 通用。 在第二个测试案例中,字符串 rev 在词法上小于 ver 。因此, s 已经具有通用性。 在第五个测试用例中,可以进行如下操作: 将 s 4 和 s 7 互换。操作后, s 变为 uniserval ;将 s 1和 s 3对调。操作后, s 变为 inuserval 。 而字符串 inuserval 则OK了/c++
最新发布
04-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值