您的位置:首页 > 编程语言

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

2014-08-16 19:55 260 查看
问题描述:

给定两个字符串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;
}

           
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息