字符串匹配_1

来源:互联网 发布:光接入网网络拓扑结构 编辑:程序博客网 时间:2024/06/06 03:21
/*问题描述:字符串匹配,暴力枚举法和Rabin-Karp来源:网易算法课日期:2017-10-26*/#include <iostream>#include <string>using namespace std;//暴力枚举法//target 目标字符串 str 待查找字符串 int match_1(string target, string str){int i, j;for (i = 0; i < str.length() - target.length(); i++){for (j = 0; j < target.length(); j++){if (target[j] == str[i + j] && j == target.length() - 1)return i;else if (target[j] != str[i + j])break;}}return -1;}//Rabin-Karp//target 目标字符串 str 待查找字符串 //个人认为有在字符串的组成上,Rabin-Karp要求字符串中元素要求是同一类型,有一定的局限性int match_2(string target, string str){//target预处理int i, j, targetValue = 0, strValue = 0;int h = 1;//最高位倍数for (i = 0; i < target.length() - 1; i++){h = h * 26;h = h % 13;}for (i = 0; i < target.length(); i++){targetValue = (26 * targetValue + (target[i] - 'a')) % 13;// %13防止整数过大越界strValue = (26 * strValue + (str[i] - 'a')) % 13;}for (i = 0; i < str.length() - target.length() + 1; i++){if (targetValue == strValue){for (j = 0; j < target.length(); j++){if (j == target.length() - 1 && target[j] == str[i + j]){return i;}else if (target[j] != str[i + j]){break;}}}strValue = (26 * (strValue - (str[i] - 'a')*h) + str[i + target.length()] - 'a') % 13;if (strValue < 0){strValue += 13;}}return -1;}/*void main(){string target = "aaabb";string str = "aaaccaaabbbaa";int index = match_2(target, str);string result = str.substr(index, target.length());cout << result << endl;}*/

原创粉丝点击