問題描述:
判斷一個字符串(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;
}