28. Implement strStr()
2018-12-10 本文已影响0人
gpfworld
题目描述:
https://leetcode.com/problems/implement-strstr/
解决方案:
class Solution {
public:
int strStr(string haystack, string needle) {
if (needle.empty()) return 0;
if (haystack.size() < needle.size()) return -1;
if (haystack.size() == needle.size()) return haystack == needle ? 0 : -1;
for (int i = 0; i < haystack.size(); i++) {
if (haystack[i] == needle[0]) {
int j = 1;
for (; j < needle.size(); j++) {
if (haystack[i + j] != needle[j])
break;
}
if (j == needle.size())
return i;
}
}
return -1;
}
};
mycode(c++):
class Solution {
public:
int strStr(string haystack, string needle) {
if (needle.empty())
return 0;
if (haystack.size() < needle.size()) return -1;
if (haystack.size() == needle.size()) return haystack == needle ? 0 : -1;
for( int i = 0;i< haystack.length();i++){
int j = 0;
int k = i;
while(j<needle.length() && k < haystack.length() &&haystack[k]==needle[j]){
j++;
k++;
}
if( j == needle.length())
return i;
}
return -1;
}
};
心得:
代码优化,速度的提升。此算法是经典模式匹配算法KMP
把代码中最特殊的情况提取出来,省去不必要的操作。
比如这里的
if (haystack.size() < needle.size()) return -1;
if (haystack.size() == needle.size()) return haystack == needle ? 0 : -1;
增加这两个判断,代码运行是见从512ms,下降到8ms。
还有就是字符串的判断操作,一般情况下,如果可以使用内置的函数,就不要自己手动去判断。比如
if (needle == "") return 0;
替换为
if (needle.empty()) return 0;
运行速度从8ms下降为4ms。
内置函数的运行速度一般比我们写的函数,效率更高。内置函数一般都是经过优化的。所以在可以使用内置函数的情况下,不要自己实现。