求两字符串的最长公有串 —— 我的“平移算法”
来源:互联网 发布:卡密软件刷q币软件下载 编辑:程序博客网 时间:2024/05/01 21:54
原创文章,转载请注明出处!
问题:
求A和B两个字符串的最长公共子串,并输出其长度。
分析:
我还没看过系统算法方面的书,不过我想以后要加强了,:-),目前我想到用“平移法”来计算最长公有串,还未分析过其它算法,不过我想,这个速度应该还不错。
原理:把两个字符串想像成两板木板,木板A短于木板B,让木板A在木板B上平移,从而找到垂直方向的公共字符串,进尔求得最长公有串
分解1
+-------------+| A |+-------------+ +---------------------+ | B | +---------------------+ ^ i
分解2
+-------------+ | A | +-------------+ +---------------------+ | B | +---------------------+ ^ i代码实现:
#include "stdafx.h"#include <iostream>using namespace std;void get_substr(char* strA, char* strB, char* strSub);int _tmain(int argc, _TCHAR* argv[]){char* a = "hello, i am =weisunding!";char* b ="my name is -weisunding, you who??";char substr[100] = {0};get_substr(a, b, substr);cout<<substr<<endl;system("pause");return 0;}//核心代码void get_substr(char* strA, char* strB, char* strSub){int sub_index = 0;int sub_len = 0;// strlen(s1) < strlen(s2)char* s1 = strA;char* s2 = strB; if (strlen(strA) > strlen(strB))swap(s1, s2); int len1 = strlen(s1);int len2 = strlen(s2);int x1,x2;for(int i = 1 - len1; i < len2; ++i){if (i <= 0){x1 = i + len1 - 1;x2 = 0; }else{x1 = 0;x2 = i;
if (len2 - x2 < sub_len)
break;}int len = 0;while( (x1 < len1) || (x2 < len2)){if ( s1[x1] == s2[x2]){++len;if (len > sub_len){sub_index = x2; //the last indexsub_len = len;}}else{len = 0;}++x1;++x2;}}if (sub_len)strncpy(strSub, s2 + sub_index - (sub_len - 1) , sub_len);}
- 求两字符串的最长公有串 —— 我的“平移算法”
- 求两字符串的最长公共连续子串
- 求给定两字符串的最长相同子串
- 求两字符串最长公共子序列LCS的应用—删除字符串的字符剩下回文串
- 【算法】求两个字符串的最长子串
- Manacher算法求字符串的最长回文子串
- 求两字符串的距离的算法
- 一个求两字串最长子序列的java算法
- 求最长单调子序列的两种算法
- poj 2774 求两字符串的最长公共子串 后缀数组
- 求字符串的最长重复子串
- 求一个字符串的最长回文串
- 求字符串的最长重复子串
- 求字符串的最长回文子串
- 求字符串的最长重复子串
- 求字符串的最长回文子串
- 一个字符串求最长的单词C++算法
- 每天一道算法题(5)——求2个字符串的最长公共子序列和最长公共子字符串
- 将Windows 2000 DNS集成到现有的BIND或基于Windows NT 4.0的DNS命名空间中
- 如何使用ADSI和WSH脚本查找域中FSMO角色持有者
- 数字转换成英文大写的SQL函数
- [CnReport] 最近想自己改改ChinaReport
- DatePicker 控件(翻译)
- 求两字符串的最长公有串 —— 我的“平移算法”
- 【程序16】
- 北京一日行之十三——科技馆、电信馆
- PB中二进制文件读取问题(原创)
- 【程序17】
- JDBC常见问题
- 北京一日行之十四——天文馆、古动物馆、大钟寺、北大、北大赛克勒
- 【程序18】
- [存档]J2ME中随机数字处理全攻略