问题描述挺简单的,就是给两个字符串,判断一个是否可以被另一个循环移位(定义
向右循环移位)得到的字符串
包含(也可为本身,也可为子串)
解法一
我们可以先直接进行字符串的移位工作,在进行字符串包含的判断,从而遍历器所有的可能性
但是这个方法比较浪费,因为要遍历所有的可能性并且要进行字符串的移位,并且在移位的过程中一不小心就会将字符串覆盖掉,所以一定要小心
代码如下
//直接翻转
bool
Judge(
char
*
str1
,
const
char
*
str2
,
int
len
)
{
//判断字符串是否为空
if
(
str1
!=
NULL
)
{
if
(strlen(
str1
) == 0)
{
return
false
;
}
}
if
(
str2
!=
NULL
)
{
if
(strlen(
str2
) == 0)
{
return
false
;
}
}
int
i =
len
;
for (i = 0; i < len; i++)
{
char tmp = str1[len-1];
int j = len - 1;
for (; j > 0; j--)
{
str1[j] = str1[j - 1];
}
str1[0] = tmp;
if (strstr(str1, str2) != NULL)
{
return true;
}
}
return
false
;
}
红字就是这段代码的重点
在进行字符串移位的过程中我们先把最后一个字母保存起来,防止被覆盖掉
然后从最后一个字母开始进行移位覆盖,将它的前一个的字母赋值给它自己,然后最后把你保存的最后一个字母赋值给第一个位置即可
就是这样!!!
j-1 tmp
A
|
A
|
B
|
C
|
D
|
解法二
我们可以先对循环移位后的结果进行分析,例如AABCD
AABCD-->DAABC-->CDAAB-->BCDAA-->ABCDA-->AABCD-->...
如果我们将后面移走的数据进行保留,会发现有如下规律
AABCD-->DAABCD-->CDAABCD-->BCDAABCD-->ABCDAABCD-->AABCDAABCD(s3)
我们可以发现如果S2可由S1循环移位得到,那么S1必定为S3的子串(S3很明显是S1的2倍
)
这个方法比较简单,难点是由S1得到S3,我们就要使用字符串函数
bool
Judge(
const
char
*
str1
,
const
char
*
str2
)
{
//判断字符串是否为空
if
(
str1
!=
NULL
)
{
if
(strlen(
str1
) == 0)
{
return
false
;
}
}
if
(
str2
!=
NULL
)
{
if
(strlen(
str2
) == 0)
{
return
false
;
}
}
char
str3[20] = {0};
strcpy(str3,
str1
);
//将str1的字符串拷贝到str3中,S3="AABCD"
strcat(str3,
str1
);
//将str1的字符串拼接到str3中,S3="AABCDAABCD"
if
(strstr(str3,
str2
) !=
NULL
)
{
return
true
;
}
else
{
return
false
;
}
free(str3);
}
int
main()
{
char
*str1 =
"AABCD"
;
char
*str2 =
"CDAA"
;
int
n = 3;
bool
result= Judge(str1, str2);
if
(result ==
true
)
{
printf(
"成功!!"
);
}
else
{
printf(
"失败!!"
);
}
system(
"pause"
);
return
0;
}
这个代码本身是十分容易想到的,但是有考了很多字符串函数的知识点
strcpy:字符串拷贝函数讲一个字符串拷贝到另一个字符串内,包括‘\0’
strnpy:指定长度的拷贝,不会将‘\0’拷贝进去
strcat:字符串拼接函数,必须保持我们拼接的这个目的字符串拥有足够的空间来保存这拼接的字符串,在拼接的时候会将原字符串后的‘\0’去掉,并且在拼接完成后的字符串后面添加‘\0’
strncat:在拼接之后的字符串会自动加‘\0’
strstr:判断一个字符串是不是另一个字符串的子串,
如果是返回一个非空值
!!!
而且在进行监视窗口监视的时候,监视只有在中断的时候才可以用,并且在函数运行完结束以后,所有的变量都已释放,监视的话都会显示无法计算,所以我们可以在函数运行的时候打一个断点,就可以监视到了