LeetCode OJ Implement strStr()
来源:互联网 发布:单片机公司有哪些 编辑:程序博客网 时间:2024/06/05 06:41
Implement strStr().
Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.
http://blog.jobbole.com/52830/
http://www.stoimen.com/blog/2012/04/17/computer-algorithms-boyer-moore-string-search-and-matching/
http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
class Solution {public: char *strStr(char *haystack, char *needle) { int i = BoyerMoore(needle, haystack); if (i == -1) return NULL; else return haystack + i; } void suffixes(char * pattern, vector<int> & suffixes) { suffixes[lengthOfPattern - 1] = lengthOfPattern; int g = lengthOfPattern - 1; int f; for (int i = lengthOfPattern - 2; i >= 0; i--) { if (i > g && suffixes[i + lengthOfPattern - 1 - f] < i - g) { suffixes[i] = suffixes[i + lengthOfPattern - 1 - f]; } else { if (i < g) { g = i; } f = i; while (g >= 0 && pattern[g] == pattern[g + lengthOfPattern - 1 - f]) { g--; } suffixes[i] = f - g; } } } void findBadCharacters(char * pattern, vector<int> & badCharacters) { for (int i = 0; i < lengthOfPattern - 1; i++) { badCharacters[pattern[i]] = lengthOfPattern - i - 1; } } void findGoodSuffixes(char * pattern, vector<int> & goodSuffixes) { vector<int> suff(lengthOfPattern, 0); suffixes(pattern, suff); for (int i = 0; i < lengthOfPattern; i++) { goodSuffixes[i] = lengthOfPattern; } int j = 0; for (int i = lengthOfPattern - 1; i >= 0; i--) { if (suff[i] == i + 1) { for (; j < lengthOfPattern - i - 1; j++) { if (goodSuffixes[j] == lengthOfPattern) { goodSuffixes[j] = lengthOfPattern - i - 1; } } } } for (int i = 0; i <= lengthOfPattern - 2; i++) { goodSuffixes[lengthOfPattern - 1 - suff[i]] = lengthOfPattern - i - 1; } } int BoyerMoore(char * pattern, char * text) { lengthOfText = strlen(text); lengthOfPattern = strlen(pattern); // some specil cases if (lengthOfPattern == 0 && lengthOfText == 0) return 0; if (lengthOfPattern == lengthOfText) { for (int i = 0; i < lengthOfText; i++) { if (pattern[i] != text[i]) return -1; } return 0; } if (lengthOfPattern == 0) return lengthOfText - 1; if (lengthOfText == 0) return -1; goodSuffixes.resize(lengthOfPattern); badCharacters.resize(256); findGoodSuffixes(pattern, goodSuffixes); findBadCharacters(pattern, badCharacters); int j = 0; while (j <= lengthOfText - lengthOfPattern) { int i; for (i = lengthOfPattern - 1; i >= 0 && pattern[i] == text[i + j]; i--); if (i < 0) { return j; // return the first matching position //cout << j << endl; // output every position that is the head of a matching j += goodSuffixes[0]; } else { j += max(goodSuffixes[i], badCharacters[text[i + j]] - lengthOfPattern + i + 1); } } return -1; }private: vector<int> goodSuffixes; vector<int> badCharacters; int lengthOfPattern; int lengthOfText;};
0 0
- LeetCode OJ:Implement strStr()
- LeetCode OJ - Implement strStr()
- [LeetCode OJ]Implement strStr()
- LeetCode OJ Implement strStr()
- LeetCode OJ - Implement strStr()
- <LeetCode OJ> 28. Implement strStr()
- 【LeetCode OJ 28】Implement strStr()
- LeetCode OJ-28-Implement strStr()
- LeetCode OJ 28 Implement strStr() [Easy]
- LeetCode OJ算法题(二十七):Implement strStr()
- LeetCode: Implement strStr()
- [Leetcode] Implement strstr()
- Leetcode: Implement strStr
- [Leetcode] Implement strStr()
- LeetCode Implement strStr()
- 【leetcode】Implement strStr()
- [LeetCode]Implement strStr()
- [LeetCode] Implement strStr()
- MySQL锁
- friend(杭电1719)
- 使用异或运算实现两处内存的原地值交换
- html5学习教程
- 光场相机原理及仿真实现
- LeetCode OJ Implement strStr()
- 测试一发markdown
- [刷题]Binary Tree Inorder Traversal
- OS X Yosemite 10.10 安装brew
- OpenGL入门12——雾
- 29、简单的apk安装器
- (素材源码)猫猫学IOS(六)UI之iOS热门游戏_超级猜图
- #个人赛第五场解题总结#
- LeetCode OJ Search Insert Position