1. 程式人生 > >C 函式 strstr 的高效實現

C 函式 strstr 的高效實現

      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[n] == sub[m])
		{
			while (str[n++] == sub[m++])
			{
				if (sub[m] == '\0')
				{
					return str + i;
				}
			}
		}
	}

	return NULL;
}