`

0805: 判断字符串 b 的所有字符是否都在字符串 a 中出现过

阅读更多

编程题
判断字符串 b 的所有字符是否都再字符串 a 中出现过,a,b都是可能包含汉字的字符串。b中重复出现的汉字,那么a中也要至少出现相同的次数。
汉字使用gbk编码(简单的所,用两个字节表示一个汉字,高字节最高位为1的代表汉字,低字节最高位可以不为1)。
int is_include(char *a  ,  char *b)
返回0 表示没有都出现过,返回1表示都出现过。

#include <stdio.h>
#include <windows.h>
#include <string.h>

typedef struct node{
	char key[2];
	int count;
	int tag;
}hnode;

/*--------------------------hash设计--------------------------------
/*本部分的哈希表采用二次探查闭散列算法*/

/* int hash(hnode item,int m)
 * 功能: 哈希函数
 * item: 字符结构体
 * m: 散列质数
*/
int hash(hnode item,int m){
	int ret;
	char key[2];
	key[0]=item.key[0];
	key[1]=item.key[1];

	if(item.tag==0){// 英文字符
		ret=key[0]%m;
	}else{ //中文字符
		ret=((key[0])*key[1])%m;
		if(ret<0){
			ret=-ret;
		}
	}

	return ret;
}


/* int p(hnode item,int i,int m2)
 * 功能: 第i次探查函数
 * item: 字符结构体
 * i:第i次探查
 * m2: 第二质数
*/
int p(hnode item,int i,int m2){
	return i*hash(item,m2);
}



/* insert_node(hnode *item,hnode *table,int hlen,int m1,int m2)
 * 功能: 将字符结构体插入一个哈希表中
 * item: 需要检查的字符结构体
 * table: 待检索的哈希表
 * hlen: 带检索的哈希表的大小
 * m1: 第一质数
 * m2: 第二质数
*/
void insert_node(hnode item,hnode *table,int m1,int m2){
	int index=hash(item,m1);
	int i=1;
	while(true){
		hnode node=*(table+index);
		if(node.tag==2){
			item.count=1;
			*(table+index)=item;    //出错点!!!
			break;
		}else{
			if(node.tag==item.tag){
				if(node.key[0]==item.key[0] && node.key[1]==item.key[1] ){   
						(*(table+index)).count=node.count+1;    //出错点!!!
						break;
				}
			}else{
					index=(index+p(item,i++,m2))%m1;
			}
		}
	}

}



/* 功能: 为一个字符串创建哈希表
 * list: 字符串
 * len: 字符串的长度
 * m1: 质数1
 * m2: 质数2
*/
hnode* create_hash(char *list,int len,int m1,int m2){
/* 新建hashtable,长度为字符串长度的两倍 */
   hnode *htable=new hnode[len*2];
   for(int k=0;k<len*2;k++){
	   hnode node;
	   node.tag=2;
	   *(htable+k)=node;
   }
   
   /* 为list中的每个字符创建hashnode */
   /* 将每个hashnode insert到 hashtable中 */
   /* 返回 hashtable的指针 */
   for(int i=0;i<len;i++){
	   hnode *node=new hnode();
	   if(list[i]>0){
		   node->key[0]=list[i];
		   node->key[1]='#';
		   node->tag=0;
	   }else{
		   node->key[0]=list[i];
		   node->key[1]=list[i++];
		   node->tag=1;	   
	   }

	   insert_node(*node,htable,m1,m2);
   }

   return htable;

}


/* 求比n小的最大质数 */
int getZhiShu(int n){
	int tag=0;
	int ret=-1;
    for(int i=n;i>=2;i--){
		for(int j=2;j<i;j++){
			if(i%j==0){
				tag=1;
				break;
			}
		}
		if(tag==0){
			ret=i;
			break;
		}
		tag=0;
			
	}
	return ret;

}




/*----------判断字串函数 int is_include(char *a  ,  char *b)-----------------*/

/*
 *功能: 判断字符串包含关系
 *a, b: 待判断的两个字符串
*/
int is_include(char *a  ,  char *b){
 /*求得a、b的字符数目*/
	int len1=strlen(a);
	int len2=strlen(b);
	int hashlen1=len1*2;
	int hashlen2=len2*2;
 //获得第一和第二质数
	int m11=getZhiShu(hashlen1);
	int m12=getZhiShu(m11-1);
	int m21=getZhiShu(hashlen2);
	int m22=getZhiShu(m21-1);
 //创建两个哈希表,哈希表的大小为字符数的两倍
	hnode *htable2=create_hash(b,len2,m21,m22);
	hnode *htable1=create_hash(a,len1,m11,m12);


 //hashb中的每个元素在 hasha中进行查找
	// 如果没找到,则退出 return -1
	// 如果找到了
	    //如果b中的个数比a中少,则查找下一个
	    //退出 return -1
	for(int i=0;i<hashlen2;i++){
		hnode node2=*(htable2+i);
		if(node2.tag!=2){
			int index=hash(node2,m11);  //出错点!!!!!!
			hnode node1=*(htable1+index);
			int n=0;
			while(node1.tag!=2){
				if(node1.tag==node2.tag){
					if(node1.key[0]==node2.key[0] &&node1.key[1]==node2.key[1]){
						if(node1.count>=node2.count){
					
							break;
						}else{
							return 0;
						}
					}
				}
				else{
					index=(index+p(node2,n++,m12))%m11;
					node1=*(htable1+index);
				}
			}
			if(node1.tag==2){
				return 0;
			}
		}
		
	}
	return 1;       

}

void main(){
	char *a="aabbcc黄老师";
	char *b="abc黄宇";

	int ret=is_include(a, b);
	printf("result is :%d\n",ret);


}


 

分享到:
评论

相关推荐

    有两个字符串A,B,判断B是不是A的子串

    1. **暴力搜索**:最直观的方法是遍历字符串A的每一个字符,然后从当前位置开始匹配字符串B的所有字符。如果匹配成功,就找到了子串,返回True;如果在A的末尾都没有找到匹配,返回False。这种方法的时间复杂度是O(n...

    判断2个字符串是否含有相同的字符

    = '\0'` 判断字符串是否结束是一种有效的方法。 6. **优化策略**: - 如果字符串A较短,B较长,可以考虑动态分配与A相同长度的数组来存储中间结果,减少空间占用。 - 为避免频繁的内存分配和释放,可以预先分配...

    判断字符串是否是回文

    这个代码主要是判断一个字符串是否为回文。回文就是正着读和反着读是同一字符串,比如abcdbca就是一回文。

    如何判断字符串的个数

    ### 如何判断字符串的个数 #### 方法简介 在本例中,我们需要编写一个名为 `SubstringCount` 的函数,该函数接受两个参数:`str` 和 `substring`。其中 `str` 是源字符串,而 `substring` 是我们想要查找的子字符...

    字符串中是否包含中文

    1. **中文符号**:如果需要判断字符串中是否包含中文符号,可以使用更广泛的Unicode范围,例如`[\u3002\uff1b\uff0c\uff1a\u201c\u201d\u2018\u2019]`等。 2. **特殊字符处理**:在实际应用中,还需要考虑到特殊字符...

    shell字符串比较判断是否为数字

    ### Shell字符串比较与数字判断详解 #### 一、概述 在Shell脚本编程中,进行字符串和数字的比较是一项常见的任务。本文将详细介绍如何在Shell脚本中进行字符串和数字的比较,包括基本的比较操作符及其使用场景,并...

    【面向对象】写一个程序判断字符串中数字的位置

    在本题目中,我们需要编写一个程序来检测输入的字符串中所有数字出现的位置,并将这些位置输出。这是一个关于C++编程、字符串处理以及面向对象编程的知识点应用问题。下面我们将详细探讨如何实现这个功能。 首先,...

    判断字符串b是否是a的非连续子串

    判断字符串b是否是a的非连续子串,例如2018字符串是否是233330321333338的非连续子串,

    判断字符串是否回文

    **回文**是一种特殊的字符串,它从前向后读和从后向前读都是一样的。例如,“madam”、“racecar”等都是回文字符串。回文检测是计算机科学中的一个经典问题,广泛应用于文本处理、密码学等领域。 #### 二、C#语言...

    判断字符串是否为IP地址

    以上四种方法都可以用来判断一个字符串是否为有效的IPv4地址。其中,方法一较为简单,但只能进行简单的字符匹配;方法二使用了系统库函数`inet_pton`,可以更准确地判断字符串是否符合IPv4地址的要求;方法三和方法...

    字符串基本操作的实现(报告+程序)

    这个操作涉及到在一个字符串A中查找另一个字符串B在特定位置之后的首次出现。首先,我们需要从字符串A的第n个字符开始遍历,逐个比较字符与B的首字符,如果匹配则继续比较后续字符,直到找到完整的B或者遍历结束。...

    Delphi 判断字符串中是否有中文.rar

    在 Delphi 编程环境中,判断字符串中是否包含中文字符是一项常见的需求,特别是在处理文本数据时。本资源提供了一个巧妙且实用的技巧来实现这一功能。Delphi 是一种基于 Object Pascal 的集成开发环境,它拥有强大的...

    C代码实例:字符串处理

    `strcmp(a[i], a[j]) &gt; 0` 判断字符串 `a[i]` 是否大于 `a[j]`。 - **交换字符串**: 如果 `a[i]` 大于 `a[j]`,则交换它们的位置。`t = a[i], a[i] = a[j], a[j] = t;` #### 4. 特殊处理 - **检测文件结束标志**: ...

    JavaScript中判断两个字符串是否相等的方法

    在JavaScript中判断两个字符串是否相等是编程基础中的重要内容,尤其对于初学者来说,理解字符串相等性的判断方法对于编写有效的代码至关重要。首先,要了解JavaScript提供了两种相等性运算符:“==”和“===”。这...

    C语言经典例子-删除字符串中指定的字符详解.docx

    删除字符串中的字符1 题目删除一个字符串中的指定字母,如:字符串 “aca...则将i位置的b,赋值给p位置,然后i和p都递增,这样的话,原来要删除的a就被后面的字符“覆盖”掉了,循环结束后相当于字符串中的a都被删除了

    java中字符串的所有用法

    - `startsWith()`: 判断字符串是否以指定的前缀开头。 - `endsWith()`: 判断字符串是否以指定的后缀结尾。 - **示例**: ```java String str = "Hello World"; System.out.println(str.startsWith("Hello")); //...

    JavaScript判断一个字符串是否包含指定子字符串的方法

    但在实际开发中,我们经常需要判断一个字符串是否包含另一个子字符串,所以开发者们会自行定义这个方法。例如,可以通过扩展String的原型来添加这个方法: ```javascript if (!String.prototype.contains) { ...

    python字符串处理实例总结.pdf

    Python 中提供了 startswith() 和 endswith() 函数来判断字符串是否以某个子字符串开始或结束。 * startswith(substring[,start[,end]]):判断字符串是否以 substring 字符串开始的。 * endswith(suffix[,start[,...

    ABAP常用字符串操作

    在ABAP中,字符串连接是一种常见的操作方式,用于将两个或多个字符串合并成一个新的字符串。实现字符串连接的方法主要是通过`CONCATENATE`语句。 **语法示例**: ```abap CONCATENATE dobj1 dobj2 INTO result [IN...

    中英文字符串分割算法C++C程序示例

    中英文字符串的切割边界的确定算法 &gt;&gt; 一些背景知识: 1. 一个汉字在c\c++的存储, 使用2个字节(char)存储; 2. 汉字存储的第一个char, 其值一定大于'~'(0111 1110=126),否则将导致识别歧义; 此处, 使用"单ASCII...

Global site tag (gtag.js) - Google Analytics