#include<iostream>
using namespace std;

//method1
/*
最直接的方法就是对src进行循环移位,再进行字符串包含的判断,从而遍历其所有的可能性。
时间复杂度为O(N^2)
*/
bool isContain(char* src,char* des)
{
     int len=strlen(src);
  for(int i=0;i<len;i++)
  {
       char temp=src[0];
    for(int j=0;j<len-1;j++)
    {
        src[j]=src[j+1];
    }
    src[len-1]=temp;
    if(strstr(src,des))
    {
        return true;
    }
  }
  return false;
}

//method2
/*
假设我们把前面移走的数据进行保留,会发现有如下的规律
ABCD->ABCDA->ABCDAB->ABCDABC->ABCDABCD
可以看出对s1做循环移位所得到的字符串都将是字符串s1s1的子字符串。如果s2可以由s1循环移位得到,那么s2一定在s1s1上。
至此我们将问题转换成考察s2是否在s1s1上,可通过调用一次strstr函数得到结果。以空间换时间,时间复杂度为O(1)
*/
bool isContain2(char* src,char* des)
{
     int len=strlen(src);
  char* src2=new char[2*len+1];
     for(int i=0;i<2*len;i++)
  {
      src2[i]=src[i%len];
  }
  src2[2*len]='\0';
  if(strstr(src2,des))
  {
      return true;
  }
  return false;
}
int main()
{
      char src[]="AABBCD";
   char des[]="CDAA";
   
   bool value=isContain2(src,des);
      if(value)cout<<"包含"<<endl;
   else cout<<"不包含"<<endl;
  
      value=isContain(src,des);
   if(value)cout<<"包含"<<endl;
   else cout<<"不包含"<<endl;
   
   system("pause");
   return 0;
}

  

posted on 2012-11-07 14:38  吉大依恋  阅读(217)  评论(0编辑  收藏  举报