實現子串查找程序 C++版(2009年華爲軟件設計大賽編程題)

問題描述: 

判斷一個字符串(dst)是否是另一個字符串(src)的子串; 

輸出子串在母串中的第一次出現的起始位置; 

匹配的時候不區分大小寫; 

不能使用庫函數(使用庫函數按 0 分計算); 

要求實現函數: 

unsigned int str_str(char * src, char *dst);

返回:如果dst是src的子串  則返回起始位置       如果不是 則返回0

輸入:src 指向母串的指針; dst 指向子串的指針

示例 

src->akrsd5859  dst->rsd

則返回3

src->Rstsawerst36ds  dst->rst

則返回8

src->dfsge         dst-> dfsgesa

則返回0

//創建時間20132/9/21
//這個算法我記得有效率更高的,但是一時想不起來就隨手敲了這個代碼,如果有大神知道希望提醒
#include <iostream>
#include <string>
using namespace std;
unsigned int str_str(char *src,char *dst)
{
	if(strlen(src) < strlen(dst))//如果母串比子串短,直接退出
		return 0;
	for(unsigned int i = 0;i <= strlen(src) - strlen(dst);++i)//比較到倆字符串
	{
		unsigned int j;
		for(j = 0;j < strlen(dst);++j)
		{
			//BEGIN	這一段爲不區分大小寫代碼的代碼段,如果區分大小寫刪除此段代碼
			if(((src[i+j] <= 'z' && src[i+j] >= 'a') 
				|| (src[i+j] <= 'Z' && src[i+j] >= 'A'))
				&& ((dst[j] <= 'z' && dst[j] >= 'a')
				|| (dst[j] <= 'Z' && dst[j] >= 'A'))
				)
			{
				if(src[i+j] != dst[j] +32 && src[i+j] != dst[j] -32 && src[i+j] != dst[j])
					break;
			}
			else //END
				if(src[i+j] != dst[j])
			{
				break;
			}
		}
		if(j == strlen(dst))//完全匹配爲
		{
			return i+1;
		}
	}
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	string str1,str2;
	cin>>str1;
	cin>>str2;
	cout<<str_str((char *)str1.c_str(),(char *)str2.c_str());
	return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章