解法一:字符串切分与拼接(使用辅助空间)
(题目有限制,字符串长大于1,则不可能为空。同时,k小于字符串长,所以k不用取余。)
先申请一块辅助空间,用于临时保存拼接后的字符串。从旋转的位置开始,把字符串分为2部分空间。先将第2部分放入辅助空间,再将第一部分放入,拼接完成。最后将拼接好的字符串放回原数组,并释放辅助空间。
char* reverseLeftWords(char* s, int n){
int len = strlen(s);
// 申请辅助空间,将原数组分区间放到temp数组拼接
char *temp = malloc(sizeof(char)*(len+1));
int index = 0;
for(int i=n; i<len; i++)
{
temp[index++] = s[i];
}
for(int j=0; j<n; j++)
{
temp[index++] = s[j];
}
temp[index] = '\0';//字符串结束标志不要忘了
// 拼接好的字符串放回原数组,并释放辅助空间
for(int k=0; k<len; k++)
{
s[k] = temp[k];
}
free(temp);
return s;
}
时间复杂度
O
(
n
)
O(n)
O(n):两次遍历
空间复杂度
O
(
n
)
O(n)
O(n):使用辅助空间
解法二:先局部翻转,再整体翻转(三次翻转)
void swap(char *a, char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
char* reverseLeftWords(char* s, int n){
int len = strlen(s);
int p,q;//双指针
// 局部翻转
// 第一区间翻转
p = 0, q=n-1;
while(p<q)
{
swap(&s[p++], &s[q--]);
}
// 第二区间翻转
p = n, q = len-1;
while(p<q)
{
swap(&s[p++], &s[q--]);
}
// 整体翻转
p = 0, q = len-1;
while(p<q)
{
swap(&s[p++], &s[q--]);
}
return s;
}
时间复杂度
O
(
n
)
O(n)
O(n):两次遍历
空间复杂度
O
(
1
)
O(1)
O(1)。