编程之美3.1字符串移位包含的问题的扩展问题

来源:互联网 发布:电商网络销售是做什么 编辑:程序博客网 时间:2024/05/01 11:37

给定两个字符串是s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含。例如给定s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false

 

我的思路是这样的:找出s2中第一个字符在s1的位置记为p1,找出s2中最后一个字符在s1中可能的位置记为p2,计算所有的p1与p2间的差值,若等于s2的长度,则比较p1与p2间的字符串与s2,若两者相等则返回true,否则返回false

 

出现的问题:开始写代码用的头文件为string.h,这个应该为c语言的头文件库,结果string不能执行==,+操作。另外substr函数的参数搞错了,第二个参数应该为子串的长度,而不是endindex

 

#include<iostream>#include<string>#include<vector>using namespace std;bool rotstr(string src,string des){//用vecPos1存储dest字符串第一个字符在src中可能出现的位置//用vecPos2存储dest字符串最后一个字符在src中可能出现的位置vector<int> vecPos1;vector<int> vecPos2;string str=src;int substrpos=str.find(des[0]);int pos=substrpos;//pos为字符在字符串中的位置while(substrpos!=-1){cout<<pos<<endl;vecPos1.push_back(pos);str=src.substr(pos+1,src.length()-pos-1);substrpos=str.find(des[0]);pos=pos+1+substrpos;}str=src;substrpos=str.find(des[des.size()-1]);pos=substrpos;while(substrpos!=-1){cout<<pos<<endl;vecPos2.push_back(pos);str=src.substr(pos+1,src.length()-pos-1);substrpos=str.find(des[des.size()-1]);pos=pos+1+substrpos;}int p1,p2;int len;string s;for(int i=0;i<vecPos1.size();i++){for(int j=0;j<vecPos2.size();j++){p1=vecPos1[i];p2=vecPos2[j];//最后一个字符出现在第一个字符前if((p2-p1)<0)len=src.size()-p1+p2+1;//最后一个字符出现在第一个字符后elselen=p2-p1+1;if(len==des.size()){if(p2-p1>=0)s=src.substr(p1,p2-p1+1);elses=src.substr(p1,src.size()-p1)+src.substr(0,p2+1);if(s==des){return true;}}}}return false;}int main(){string src="AABBCD";string des="DAAB";if(rotstr(src,des))cout<<"the string des is included in the rotated string of src "<<endl;elsecout<<"the string des is not included in the rotated string of src "<<endl;int i;cin>>i;return 0;}

原创粉丝点击