题目描述:
算法思想:本题采用暴力法解决,即两个for循环来分别遍历主串和子串,并利用哨兵,当主串与子串发生不匹配的时候直接开始下一轮匹配,存在的一个问题是当笔者采用上方的代码时,在极端代码情况下会产生运行超时,因此笔者先将两个数组长度进行计算,然后采用计算好的数据进行计算,超时现象不再出现。
本题一个巧妙之处在于,重新开始新一轮循环的时候,使用的判断语句为if(haystack[i + j] != needle[j]),这里的 i + j 就很便利的解决了主串每次的回溯问题。
/* 此代码逻辑没问题,但是在特(e)殊(xin)的测试用例的时候会运行超时
故在改进版本先讲二者的数组长度计算出来,再利用长度参与运算
int strStr(char * haystack, char * needle)
{
int i, j;
int flag = 0;
if(strlen(needle) == 0 && strlen(haystack) == 0)
return 0;
for(i = 0;i < strlen(haystack);i++)
{
flag = 0;
for(j = 0;j < strlen(needle);j++)
{
if(haystack[i + j] != needle[j])
{
flag = 1;
break;
}
}
if(flag == 0)
return i;
}
return -1;
}*/
int strStr(char * haystack, char * needle)
{
int i, j;
int flag = 0;
int hlen = strlen(haystack);
int nlen = strlen(needle);
if(nlen == 0 && hlen == 0) //如果两个长度均为0就返回0,否则返回-1
return 0;
for(i = 0;i < hlen;i++)
{
flag = 0;
for(j = 0;j < nlen;j++)
{
if(haystack[i + j] != needle[j]) //当匹配出现不一样时,哨兵置1,直接开始下一轮匹配
{
flag = 1;
break;
}
}
if(flag == 0) //当匹配完了以后哨兵没变化,因此此时的 i 就是所求的解
return i;
}
return -1;
}