题目:
给定两个字符串S1和S2,要求判断S2能否被S1做循环移位得到的字符串包含。
例如:s1=AABCD和S2=CDAA,返回true,
s1=ABCD和s2=ACBD,返回false。
对于这个题目我给出了三种答案,
第一种:
通过创建一个和s2字符串大小一样的堆空间,然后将s1移位以后的字符串拷贝进去,然后再判断是否和s2相等,具体代码如下:
- /**
- ** 1表示包含, 0表示不包含
- ** 我给的答案,出现很多次的字符串拷贝,已经额外的字符串分配空间
- **/
- int strcontain(const char* const str1, const char * const str2){
- if(NULL == str1 || NULL == str2)
- return 0;
-
- int len1, len2, i;
- char* tmp = NULL;
- len1 = strlen(str1);
- len2 = strlen(str2);
-
- if(len2 > len1)
- return 0;
-
- tmp = (char*)malloc(len2 + 1);
- memset(tmp, 0, len2 + 1);
-
- for(i = 0; i < len1; i++){
- if(len1 >= len2 + i)
- strncpy(tmp, str1 + i, len2);
- else{
- strncpy(tmp, str1 + i, len1 - i);
- strncpy(tmp + len1 - i, str1, len2 - len1 + i);
- }
- if(strcmp(tmp, str2) == 0){
- free(tmp);
- tmp = NULL;
- return 1;
- }
- }
- free(tmp);
- return 0;
- }
第二种方法是编程之美上给出来的,代码如下:
- /**
- ** code 2 提供的答案
- ** 额外的分配空间
- **/
- int code2(const char* const str1, const char* const str2){
- if(NULL == str1 || NULL == str2)
- return 0;
-
- int len1, len2, i;
- char* tmp = NULL;
- len1 = strlen(str1);
- len2 = strlen(str2);
-
- if(len2 > len1)
- return 0;
-
- tmp = (char*)malloc(len1 * 2);
- memset(tmp, 0, len1*2);
- strcpy(tmp, str1);
-
- for(i = 0; i < len1; i++){
- if(strncmp(tmp + i, str2, len2) == 0){
- free(tmp);
- tmp = NULL;
- return 1;
- }
- tmp[len1 + i] = str1[i];
- }
-
- free(tmp);
- tmp = NULL;
- return 0;
- }
第三种方法和第一种其实非常相似,只是没有在额外的分配堆空间:
- /**
- ** code3
- ** 不分配额外空间
- **/
- int code3(const char* const str1, const char* const str2){
- if(NULL == str1 || NULL == str2)
- return 0;
-
- int len1, len2, i;
- len1 = strlen(str1);
- len2 = strlen(str2);
- int comparelen = 0;
-
- if(len2 > len1)
- return 0;
-
- for(i = 0; i < len1; i++){
- if(len1 >= i + len2){
- if(strncmp(str1 + i, str2, len2) == 0)
- return 1;
- }else{
- if((strncmp(str1 + i, str2, len1 - i) == 0)
- && strncmp(str1, str2 + len1 -i, len2 + i -len1) == 0)
- return 1;
- }
- }
-
- return 0;
- }
阅读(3698) | 评论(0) | 转发(0) |