直通BAT的字符串
案例一:
如果一个字符串str,把字符串str前面任意的部分挪到后面而形成的字符串叫做str的旋转词。如“1234”的旋转词有“2341”,“3412”等。有两个字符串str和str,判断两个是否为旋转词。
解决方案:
(1)判断str1和str2长度是否是相等的,如果长度不等,则不是旋转词
(2)str1+str1组成一个大的字符串,然后从大字符串中,从头到尾遍历,当遇到和str2相等的字符串,则是旋转词
时间复杂度是O(N)
案例二:
给定一个字符串,在单词间做逆序调整。如“dog loves pig”->"pig loves dog"
解决方案如下:
(1)实现将字符串局部所有字符逆序的函数f
(2)利用f将字符串中所有字符逆序。如“dog loves pig”->"gip sevol god"
(3)找到逆序后的字符串中的每一个单词区域,利用f将每一个单词的区域逆序.如“gip sevol god” ->"pig loves dog"
案例三:
给定一个字符串,和一个整数i,i代表str中的位置,将str[0-i]移到右侧,[i+1,N-1]移到左侧。要求时间复杂度是O(N),空间复杂度是O(1)
"ABCDE" i=2
解决方案如下:
(1)将str中的[0,i]范围内的字符逆序 "ABC" ->"CBA"
(2)将str中的[i,N-1]范围内的字符逆序"DE" -> "ED"
(3)找到逆序后的字符串中整个逆序 "CBAED" -> "DEABC"
总结:类似于上述三种的字符串中字符交换,活用局部逆序函数组合的方式来完成
案例四:
给定一个字符串类型的数组strs,请找到一种拼接的顺序,使得将所有的字符串拼接起来组成的大字符串是所有可能性中字典顺序是最小的,并且返回这个大字符串。如strs = {"abc","de"} 可以拼接成“abcde”或者是"deabc",但是前者字典数序是最小的,所以返回"abcde"
解决方案如下:
时间复杂度是O(NlogN),其本质是是一种排序
str1和str2的拼接,str1+str2和str2+str1,如果str1+str2<str2+str1,则str1+str2放在前面,否则放在后面。
如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。比如A="12345",A的旋转词有"12345","23451","34512","45123"和"51234"。对于两个字符串A和B,请判断A和B是否互为旋转词。
给定两个字符串A和B及他们的长度lena,lenb,请返回一个bool值,代表他们是否互为旋转词。
"cdab",4,"abcd",4
返回:true
代码:
class Rotation {
public:
bool chkRotation(string A, int lena, string B, int lenb) {
// write code here
//判断两个字符串的长度是否相等
if ( lena == NULL || lenb == NULL ||lena != lenb)return false;
string str1 = A + A;
//if (strstr(str1.c_str(),B.c_str()))
/*if (str1.find(B)!=-1)
return true;
else
return false;*/
int i=0,j=0;
while(i<=A.size())
{
if (str1[i+j] == B[j])
{
j++;
if (j == B.size()-1)
return true;
}
else
{
i++;
j=0;
}
}
return false;
}
};