Advertisement

判断两个字符串是否由相同字符组成

阅读量:

题目:判断两个字符串是否由相同字符组成,由相同字符组成的条件是:长度相同,且所含的字符个数相同,eg:s1 = ”adfgg“;s2 = ”gfdga“ ,我们称s1和s2是匹配的。

复制代码
 /* 法一:假设全为ASCII码,则字符的范围为0-255,所以可以开辟两个大小为256的数组,用于保存每个字符串中每个字符出现的次数。

    
  *       然后比较两个数组的值是否全部相同,是,则匹配;否则,则不匹配。
    
  *       改进一下,可以只开辟一个数组,遍历第一个字符串时,对遇到的每个字符,其次数+1,
    
  *       最后得到count1数组(表示以下标为ASCII值的字符在字符串中出现的次数); 然后遍历第二个字符串,对遇到的每个字符,将其count1数组中
    
  *       的次数-1;最后看count1数组中的元素是否全部为零,是,则匹配,否则,不匹配;
    
  *       O(n)
    
  */
    
 bool isMatch_E1(string s1, string s2)
    
 {
    
 	if (s1.length() != s2.length())
    
 		return false;
    
 	int len = s1.length();
    
 	const int size = 256;
    
 	int count1[size] = { 0 }; //保存s1中每个字符出现的次数,下标为相应字符的ASCII码值
    
 	int i = 0;
    
 	for (i = 0; i < len; i++)
    
 	{
    
 		count1[s1[i]]++;
    
 	}
    
 	for (i = 0; i < len; i++)
    
 	{
    
 		count1[s2[i]]--;
    
 		if (count1[s2[i]] < 0) // 表示s2[i] 在s2中出现的次数大于在s1中出现的次数
    
 			return false;
    
 	}
    
 	return true;
    
 }
    
    
    
    

方法二:

复制代码
 bool CompairStrs(const string& s1, const string& s2)

    
 {
    
 	int len1 = s1.length();
    
 	int len2 = s2.length();
    
 	if (len1 != len2)
    
 		return false;
    
 	int count[256] = { 0 };
    
 	for (int i = 0; i < len1; ++i)
    
 	{
    
 		count[s1[i]]++;
    
 		count[s2[i]]--;
    
 	}
    
 	for (int i = 0; i < len1; ++i)
    
 	{
    
 		if (count[s1[i]] != 0)
    
 			return false;
    
 	}
    
 	return true;
    
 }
    
    
    
    

当然啦,我们还可以先给 s1 和 s2 字符串排序 然后,compare排序后的字符是否相同。

全部评论 (0)

还没有任何评论哟~