学习算法博客------第二章 字符串是否包含问题

出处:http://blog.csdn.net/v_JULY_v/article/details/6347454


自己实现一下:

#include <stdio.h>
#include <assert.h>

#define INVALID 0
#define TRUE 	1
#define FALSE 	0
typedef int BOOL;

//O(m*n)方法 找字串是否都在原字符串中出现
BOOL findSubstrFunc1(const char *str, const char *substr)
{
	assert(str != NULL);
	assert(substr != NULL);

//下面这句话一定注意!!!!传参数是const,将其赋值给新变量,新变量也要为const
	const char *temp = str;     
	for (;*substr != '\0'; ++substr, str = temp){
		for (;*str != '\0'; ++str){
			if(*str == *substr){
				break;
			}
		}
		if (*str == '\0'){
			return FALSE;
		}
	}
	return TRUE;
}
//没有写排序函数,这里仅仅假设传来的两个字符串都经过排序了 O(m*n)以下
BOOL findSubstrFunc2(const char *str, const char *substr)
{
	assert(str != NULL);
	assert(substr != NULL);

	while (*str != '\0' && *substr != '\0'){
		while (*str < *substr && *str != '\0'){
			++str;
		}
		if (*str == *substr){
			++str;
			++substr;
		}
		if ( *str > *substr ){
			return FALSE;
		}
	}
	if (*str == '\0' && *substr != '\0'){
		return FALSE;
	}
	else {
		return TRUE;
	}

}
//O(m+n)方法,用数组,或者hash表 找字串 是否都在原字符串出现
BOOL findSubstrFunc3(const char *str, const char *substr)
{
	assert(str != NULL);
	assert(substr != NULL);

	char hash[26] = {0};
	for (;*str != '\0'; ++str){
		hash[*str - 'A'] = TRUE;
	}

	for (; *substr != '\0'; ++substr){
		if (hash[*substr - 'A'] != TRUE){
			return FALSE;
		}
	}
	
	return TRUE;
}
#define SHIFT 3
#define MASK  0x07

void setBit(char *hash, int bit)
{
	hash[bit >> SHIFT] |= 1 << (bit & MASK);
}
void clearBit(char *hash, int bit)
{
	hash[bit >> SHIFT] &= ~ (1 << (bit & MASK));
}
char testBit(char *hash, int bit)
{
	return (hash[bit >> SHIFT] & (1 << (bit & MASK))) != 0;
}
//用bitmap 方法 找字串看是否都在原字符串中
BOOL findSubstrFunc3_BITMAP(const char *str, const char *substr)
{
	assert(str != NULL);
	assert(substr != NULL);

	char hash[4] = {0};
	for (; *str != '\0'; ++str){
		setBit(hash, *str - 'A');
	}

	for (; *substr != '\0'; ++substr){
		if (testBit(hash, *substr - 'A') != 1)
			return FALSE;
	}
	
	return TRUE;
}
//找出字符串中 第一个只出现一次的字符,dcldallf 就打印'd'一个
BOOL findFirstAppear(const char *str)
{
	assert(str != NULL);

	char hash[26] = {0};
	for (; *str != '\0'; ++str){
		if (hash[*str - 'A'] != TRUE){
			hash[*str - 'A'] = TRUE;
		}
		else {
			printf("%c\n", *str);
			return TRUE;
		}
	}

	return FALSE;
}
//字符串拷贝 由调用者保证目标buf有足够位置
void strCOPY(char *des, const char *src)
{
	assert(des != NULL);
	assert(src != NULL);

	while ((*des++ = *src++) != '\0')
		;
}
//下面是别人实现的一种方式,你没有想到,以后要记得 这种拷贝的函数 很多要弄成链式的
//10分  
//为了实现链式操作,将目的地址返回,加3分!  
char * strcpy( char *strDest, const char *strSrc )   
{  
    assert( (strDest != NULL) && (strSrc != NULL) );  
    char *address = strDest;   
    while( (*strDest++ = * strSrc++) != '/0' );   
    return address;  
}   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值