您的位置:首页 > 其它

C 函数 strstr 的高效实现

2014-06-20 17:37 253 查看
C函数库中有一个函数 strstr(char*, char*),它实现的是在一个原字符串中查找一个子串,如果找到这样的一个子串,返回这个子串在原字符串中的起始位置,若没有找到这样的一个子串,则返回NULL。
但是,函数库中实现的仅是一般情况下的查找,即没有做太多优化,在执行一些特殊的字符串时效率很低,所以,在很多面试中要求改进这个算法,实现效率高的 strstr 算法,这里,我对原算法进行几处改动,在对某些特殊测试用例时,执行效率确实比原算法高出许多,这里,贴出实现代码,改动的地方在实现中已有注释,当然,各位朋友有更高效率的实现方法,请不要吝啬您的指教:
代码如下所示:
#include <cstring>
#include <iostream>
#include <cassert>

using namespace std;

char* my_strstr(char* str, char* sub)
{
	assert(str != NULL);
	assert(sub != NULL);

	int str_len = strlen(str);
	int sub_len = strlen(sub);

	if (str_len < sub_len)					/*不用比较,肯定不是*/
	{
		return NULL;
	}

	if (str_len != 0 && sub_len == 0)		/*aaaaaaaaaaaaaaaaaa, "" ,比较需要花费时间很多*/
	{
		cout << "子串为空。。。" << endl;

		return NULL;
	}

	if (str_len == 0 && sub_len == 0)		/*都为空可以直接返回*/
	{
		cout << "原串和子串都为空 !" << endl;

		return str;
	}

	for (int i = 0; i != strlen(str); ++i)
	{
		int m = 0, n = i;

		cout << "原串剩余的长度 : " << strlen(str + i) << endl;
		cout << "子串的长度 : " << sub_len << endl;

		if (strlen(str + i) < sub_len)				/*往后找如果原串长度不够了,则肯定不是*/
		{
			cout << "子串太长啦。。。" << endl;

			return NULL;
		}

		if (str
 == sub[m])
		{
			while (str[n++] == sub[m++])
			{
				if (sub[m] == '\0')
				{
					return str + i;
				}
			}
		}
	}

	return NULL;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: