[编程之美] PSet3.1 字符串移位包含的问题

来源:互联网 发布:c语言常用代码 编辑:程序博客网 时间:2024/04/29 23:40

问题描述:

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


思路分析:

解法一:直接循环移位

      代码如下:

//解法一:通过对src循环移位判断是否dst在src内bool findStr(char src[],char dst[],int srcLen , int dstLen){int K = srcLen;while(K--){//循环右移dstLen次恢复原位char tempChar = src[srcLen-1];for(int i=srcLen-1 ; i>=1 ; i--)//移位一次src[i] = src[i-1];src[0] = tempChar;if(strstr(src,dst))return true;}return false;}

解法二:直接分析移位结果,发现ABCD移位后的结果一定是ABCDABCD的子串,通过提高空间复杂度来换取时间复杂度的降低。代码如下:

//解法二:通过在组合字符串[src,src]上寻找dst进行判定bool findStr(char src[],char dst[], int srcLen){bool flag = false;char *srcsrc = new char[2*srcLen+1];//多存放一个'\0'strcpy_s(srcsrc, sizeof(char)*(2*srcLen+1) , src);strcat_s(srcsrc, sizeof(char)*(2*srcLen+1) , src);if(strstr(srcsrc,dst))flag =  true;delete []srcsrc;return flag;}

解法三:不需申请过多的空间,直接循环src,当循环到尾部时,跳转到头部即可

//解法三:直接依照src首尾相连进行遍历bool findStr(char src[],char dst[], int srcLen , int dstLen){bool flag  = false;for(int i=0 ; i<srcLen ; i++){if(src[i] == dst[0]){//寻找首字母匹配flag = true;for(int j=1 ; j<dstLen ; j++){if(src[(i+j)%srcLen] != dst[j]){flag = false;break;}}}if(flag == true)//找到了这样的子序列,跳出循环break;}return flag;}



           

0 0
原创粉丝点击