【CareerCup】 Arrays and Strings—Q1.7

转载请注明出处:http://write.blog.csdn.net/postlist/0/all/draft

   

    题目:

    Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., “waterbottle” is a rotation of “erbottlewat”).

    翻译:

    假设你有一个可以判断一个字符串是否是另一个字符串子串的isSubstring函数, 对于给定的字符串s1和s2,写一个程序,只调用一次isSubstring就能判断出s2是否是s1的旋转字符串。比如:"waterbottle"是"erbottlewat"的旋转字符串。

    翻译:

    这里稍微补充下,旋转字符串指的是将一个字符串的前面(后面)几位字符移到后面(前面)。

    题目中要求用到isSubstring而且只能用一次,要用到该函数,自然两个字符串的长度不能相同,不可以直接对s1和s2运用该函数。旋转字符串仅仅是前面的移到了后面或者后面的移到了前面,因此我们可以将s1+s1,而后判断s2是否是s1+s1的子串,如果是,则证明s2是s1的旋转字符串。如上面的"erbottlewat" + "erbottlewat" = "erbottlewaterbottlewat",很明显"waterbottle"是其子串(前面的加粗部分)。

    实现代码:    

bool isRotate(string s1,string s2)
{
	if(s1.length() != s2.length())
		return false;
	return isSubstring(s1+s1,s2);
}
    实现代码很简单,而且isSubstring函数可以用KMP算法来实现,我们这里不再测试!

    下面我们再围绕旋转字符串来看个问题:

    已知一个字符串,将其第k个位之前(从0开始计)的字符旋转至该字符串的尾部,求旋转后的字符串。比如,对于字符串“abcdef”,将其第2个位置前的字符旋转至尾部,得到“cdefab”。要求空间复杂度为O(1),时间复杂度为O(n)

    思路:

    很容易想到的方法是另外开辟一个长度为len+1的字符数组(最后一位用来保存'\0'),将原字符串的第k位之前的字符拷贝到字符数组的后面,将第k位(含第k位)后面的字符拷贝到字符数组的前面,这样做时间复杂度为O(n),空间复杂度也为O(n)。

    而题目中要求空间复杂度为O(1),也就是旋转要在原地进行,我们可以这么做,先将需要旋转的两部分字符分别反转,再将整个字符串反转,便得到了所求的旋转字符串。比如,“abcdef”,如果要通过旋转得到“cdefab”,我们可以先分别将“ab”和“cdef”反转,得到“bafedc”,再将“bafedc”反转,得到要求的旋转字符串为“cdefab”。

    实现代码:

/****************************************************************************************
题目描述:
已知一个字符串,将其第k个位之前(从0开始计)的字符旋转至该字符串的尾部,求旋转后的字符串。
比如,对于字符串“abcdef”,将其第2个位置前的字符旋转至尾部,得到“cdefab”。
Date:2014-03-19
*****************************************************************************************/

#include<stdio.h>
#include<string.h>

/*
将字符串str的start和end位置之间的字符反转
*/
void reverseString(char *str,int start,int end)
{
	while(start < end)
	{
		str[start] = str[start] + str[end];
		str[end] = str[start] - str[end];
		str[start] = str[start] - str[end];
		start++;
		end--;
	}
}

/*
进行三次反转
*/
void rotate(char *str,int k)
{
	int len = strlen(str);
	if(k <= 0 || len <= k)
		return ;
	reverseString(str,0,k-1);
	reverseString(str,k,len-1);
	reverseString(str,0,len-1);
}

int main()
{
	char str1[] = "abcdef";
	char str2[] = "abcdefghket";
	rotate(str1,1);
	rotate(str2,4);
	puts(str1);
	puts(str2);
	return 0;
}
    测试结果:

【CareerCup】 Arrays and Strings—Q1.7_第1张图片
  

你可能感兴趣的:(String,array,Careercup)