假设字符串s1=AABCD,s2=CDAA,判断s2是否可以通过S1的循环移位得到字符串包含。
如 s1移两位: 1.ABCDA->2.BCDAA 则此时包含了 S2="CDAA"
解题思路:
分解s1的循环移位得到:
AABCD,ABCDA,BCDAA,CDAAB,.....
如果我们将前面移走的字符串保留下来,则有:
AABCD,AABCDA,AABCDAA,AABCDAAB,AABCDAABC,AABCDAABCD
这里,我们可以发现,实际对s1的循环移位得到的字符串实际为s1s1。
那么我们判断s2是否可以通过s1循环移位得到包含,则只需要判断s1s1中是否含有s2即可以。
用提高空间复杂度来换取时间复杂度的减低的目的。
strstr函数原型为:
extern char *strstr(char *str1, char *str2);
其参数是传统的char *型字符串,string型数据类型是不能作为其参数的。但可以通过string成员函数string::c_str()转换成char*类型。象这样调用:
strstr(str1.c_str(), str2.c_str())
- #include
- #include
- using namespace std;
- /*函数原型是char *strstr(char *str1,char *str2);
- **作用是找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)
- ** 如果找到返回该位置的指针。若找不到,返回NULL指针。
- */
- char * mystrstr(char * str1,char * str2)
- {
- char * p1=str1;
- char * p2=str2;
- while(*str1!='\0' && *p2!='\0')
- {
- if(*str1==*p2)
- {
- str1++;
- p2++;
- }
- else
- {
- str1++;
- p1=str1;//如果不相等,重置p1,p2
- p2=str2;
- }
- }
- if(*p2=='\0')
- return p1;
- else
- return NULL;
- }
- //s2是否可以通过s1循环移位得到包含,则只需要判断s1s1中是否含有s2即可以。
- int rotstr(string src,string des)
- {
- string temp=src+src;
- if(strstr(temp.c_str(),des.c_str())==NULL)
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
- int main()
- {
- char * src="AABBCD";
- char * des="DAAB";
- int flag=rotstr(src,des);
- printf("1 include and 0 not include: %d\n",flag);
- char * str1="abcdef";
- char * str2="def";
- char * str=mystrstr(str1,str2);
- if(str!=NULL)
- {
- printf("exist %s\n",str);
- }
- return 0;
- }
- /*
- 1 include and 0 not include: 1
- exist def
- Press any key to continue
- */
阅读(859) | 评论(0) | 转发(0) |