目录
一、题目描述
二、初次解答
1. 思路:暴力匹配。使用i和j来遍历两个字符串(i遍历主串,j遍历子串)。若指向元素相等则往后比较,否则i回溯到原先位置的下一个位置,j回溯到0位置。一旦匹配完毕,就返回子串在主串中的下标;若遍历完主串也没找到子串,则返回-1.
2. 代码:
int strStr(char* haystack, char* needle) { int i = 0; //遍历主串 int j = 0; //遍历子串 int ret; //保存子串在主串中的下标 /* 在主串中寻找子串 */ while (haystack[i] != '\0' && needle[j] != '\0') { ret = i; while(haystack[i] != '\0' && needle[j] != '\0') { if (haystack[i] == needle[j]) { i++; j++; } else { j = 0; i = ret + 1; break; } } } /* 是否查找到子串 */ if (needle[j] == '\0') return ret; else return -1; }
3. 优点:①容易想到且代码简单。②空间复杂度为O(1)。
4. 缺点:主串的遍历指针会重复回溯,使得查找效率不高。
三、优化解法
针对子串在主串中的模式匹配,可以采用KMP算法求解,能够解决上述的重复回溯问题。由于KMP算法难度较高,此处不给出详细解法。
四、C++写法
class Solution {
public:
int strStr(string haystack, string needle) {
return haystack.find(needle);
}
};
五、总结
针对字符串的模式匹配,可以采用KMP算法求解。