Day 1字符串的旋转
Posted 小可爱的大笨蛋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day 1字符串的旋转相关的知识,希望对你有一定的参考价值。
要求:将字符串的前面的若干个字符移到字符串的后面。
例如:将 abcdef 的 abc 移动到 def 的后面。
1. 暴力破解
所谓的暴力法就是将字符的每一个字符挨个移动到当前的字符串的后面,如果说字符串的总长度为 n,移动的位数为 m,则暴力破解法需要的复杂度就是O(n*m),控件复杂度为O(1)。
这个时间复杂度是比较高的,所以我们需要找一种更好的方式进行优化。
3. 三步反转法
所谓三步反转法总共分为三步:
1. 将字符串 Z 分割为两部分:X和Y,即根据反转的位置将字符串进行分割。例如:字符串 abcdef 将 abc 移动到 def 的后面,就可以分为X:abc,Y:def。
2. 将 X 和 Y 分别进行反转,即 X’ = cba,Y’ = fed。
3. 将 X’ 和 Y’ 合并的到新的符串 Z’ ,同时将 Z‘ 进行反转得到 Z’‘。此时的 Z’’ 就是最终的结果。即 Z’ = cbafed,反转后得到 Z’’ = defabc。
/**
将字符串进行反转。
s: 需要进行反转的字符串
start: 字符串反转开始的位置
end: 字符串反转结束的位置
*/
void reverseString(char *s,int start,int end)
while(start < end)
char t = s[start];
s[start++] = s[end];
s[end --] = t;
/**
将字符串进行旋转
s: 需要进行旋转的字符串
n: 字符串的长度
m: 开始旋转的位置
*/
void rotateString(char *s,int n,int m)
m %= n;
reverseString(s,0,m-1); // 三步反转法进行旋转
reverseString(s,m,n-1);
reverseString(s,0,n-1);
以上是关于Day 1字符串的旋转的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—189. 旋转数组(双指针)—day20
Leetcode刷题100天—189. 旋转数组(双指针)—day20