字符串移动包含
个人信息:就读于燕大本科软件工程专业 目前大三;
本人博客:google搜索“cqs_2012”即可;
个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;
博客内容:求1-n的阶乘之和;
博客时间:2014-4-15;
编程语言:C++ ;
编程坏境:Windows 7 专业版 x64;
编程工具:vs2008 32位编译器;
制图工具:office 2010 ppt;
硬件信息:7G-3 笔记本;
引言
题目家里的地耕一次和两次是不一样的。
思路
实验KMP算法,变体KMP算法
KMP算法改编:当a字符串跑到最后快结束的时候,怎么办呢?正宗KMP会结束,但是对于移动字符串是不行的,我们这时候应该记录a遍历的次数,如果超过了第一次,则应该记录,不让它超过2次遍历a即可。对于遍历到a末尾的时候,如果需要可以用模转到a的头部。
代码程序截图如下
程序解释
第一行输入 a
第二行输入 b
第三行输出 a
第四行输出 b
第五行输出 结果
以下循环如此
test.cpp(个人第二次实现kmp,并灵活改编算法)
#include<iostream> #include<string> using namespace std ; // function: KMP // input: two strings A and B // output: bool var // 功能:字符串移位包含用KMP算法 bool _KML_rotate_including(string a,string b); int main( ) { string a,b; while(cin>>a>>b) { cout<<"a= "<<a<<endl<<"b= "<<b<<endl; cout<<"result = "<<_KML_rotate_including(a, b)<<endl; } system("pause") ; return 0 ; } // function: KMP // input: two strings A and B // output: bool var // 功能:字符串移位包含用KMP算法 bool _KML_rotate_including(string a,string b) { if(!a.empty() && !b.empty()) { // first action: int * first_deal = new int[b.length()]; first_deal[0] = 0; string s1,s2; for(int i = 1;i<b.length();i++) { first_deal[i] = 0; for(int j = i ;j>0;j --) { s1 = b.substr(0,j); s2 = b.substr(i-j+1,j); if( s1.compare(s2) == 0 ) { first_deal[i] = j ; break ; } } } // second action: KMP int over = 0; for(int i =0,j=0; i<a.length(); ) { if(a[i] == b[j]) { i = (i+1); if(i >= a.length() ) { if( over == 0) { i = i% a.length(); over = 1; } else return false; } j++; if(j == b.length()) { return true; } } else { if( j > 0 ) j = first_deal[j-1]; else if(i < a.length()-1) { i++ ; } else return false; } } } else { cout<<"exception of function _KML_rotate_including input"<<endl; return false; } }