转载请注明出处: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; }测试结果: