abcdef->cdefab(字符串旋转)

题目:左旋转字符串

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(n)

思路一、暴力移位法

核心思想:就是把需要移动的字符一步步移动到字符串的尾部

//暴力移位法void leftshiftone(char *s, int n)
{
    char t = s[0];//保存第一个字符
    for(int i = 1;i < n; i++)
        s[i-1] = s[i];
    s[n-1] = t;
}

void leftshift(char *s, int n, int m)
{
    while(m--)
        leftshiftone(s,n);
}

分析时间复杂度和空间复杂度:需要移动m个字符到字符串的尾部,所以需要m*n次操作,时间复杂度为O(mn);同时我们要设立一个变量保存第一个字符,空间复杂度为O(1)

思路二、三步翻转法

反转X^T X=“abc” X^T="cba" (X^TY^T)^T = YX

参考代码:

//三步翻转法.cppvoid ReverseString(char *s, int from, int to)
{
    while(from < to)
    {
        char t = s[from];
        s[from++] = s[to];
        s[to--] = t;
    }
}

void LeftRotateString(char *s, int n, int m)
{
    m %= n;  //如果左移动大于n位,那么和%n是等价的
    ReverseString(s, 0, m-1);//反转[0, m-1] abc->cba
    ReverseString(s, m, n-1);//反转[m, n-1] def->fed
    ReverseString(s, 0, n-1);//反转[0, n-1] cbafed->defabc
}

分析时间复杂度和空间复杂度:时间浮渣度为O(n),空间复杂度为O(1)

abcdef->cdefab(字符串旋转)

时间: 2024-11-09 03:33:09

abcdef->cdefab(字符串旋转)的相关文章

笔试算法题(35):最长递增子序列 &amp; 判定一个字符串是否可由另一个字符串旋转得到

出题:求数组中最长递增子序列的长度(递增子序列的元素可以不相连): 分析: 解法1:应用DP之前需要确定当前问题是否具有无后效性,也就是每个状态都是对之前状态的一个总结,之后的状态仅会受到前一个状态的影响:对于递增子序列 而言,可以首先确定前面k个元素的最长子序列,然后计算增加一个元素之后的最长子序列.由于每个位置i都会与0-i的每个位置之前的LIS进行比较,并选 择保持递增的一个序列,所以总能找到LIS,但是时间复杂度为O(N^2),空间复杂度为O(N): 此解法的性能的瓶颈在于对于位置为i+

IT企业面试题(java描述)-字符串旋转(旋转字母或者单词)

这一章节我们来讨论一下IT企业面试题:字符串旋转(旋转字母或者单词). 题目: 将字符串"abcdef"旋转成"defabc" 或者 将字符串"i am a student."旋转成"student. a am i" 而且在上面的题目里面还会加上不能够使用库函数的限制,我们下面将讨论解题的思路以及具体的代码. 1.思路 (1)暴力解法 就是一个字符一个字符的往后扔 (2)分部法 将不旋转部分和旋转部分分开来处理,先各自反转,再

【C语言】编写函数实现字符串旋转

//编写函数实现字符串旋转 #include <stdio.h> #include <assert.h> #include <string.h> void reverse(char *left, char *right) { char temp; assert(left); assert(right); while (right > left) { temp = *left; *left = *right; *right = temp; left++; right

字符串旋转问题

字符串旋转问题:"abcdefgh" 向左旋转3个字符,"defghabc" int gcd(int a,int b) {//求最大公约数 if(a==0||b==0) return -1; int t=a; if(a<b) { a=b; b=t; } while(b) { t=a%b; a=b; b=t; } return a; } void rotation(char *p,int n,int rotdist) {//旋转 int right=gcd(ro

【c语言】判断一个字符串是否为另外一个字符串旋转之后的字符串

// .判断一个字符串是否为另外一个字符串旋转之后的字符串. // 例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0 #include <stdio.h> #include <string.h> #include <assert.h> int rotate(char *p, char *q) { assert(p != NULL && q != NULL); strncat(p,p,strlen(p

abcdef-&amp;gt;cdefab(字符串旋转)

题目:左旋转字符串 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab. 请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(n) 思路一.暴力移位法 核心思想:就是把须要移动的字符一步步移动到字符串的尾部 //暴力移位法void leftshiftone(char *s, int n) { char t = s[0];//保存第一个字符 for(int i = 1;i < n; i+

字符串旋转(str.find()---KMP)

此题旋转带有技巧性,问题转化为常见的问题,熟练STL可以直接用str.find()函数,其是主要想用KMP算法实现字符串的查找算法... //如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词.比如A = "12345", A的旋转词有"12345", "23451", "34512", "45123"和"51234".对于两个字符串A和B,请判断A和B是否互

判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0. #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> char *my_strncat(char *dest, const char *src, size_t count) {     assert(dest);     assert(src);     c

字符串旋转的若干种算法 (待续)

题目描述: 对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边. 给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果. 测试样例: "AbcdeFgh",8,4  (为了方便起见我把两部分的起始元素用大写字母表示) 返回:"FghAbcde" 思路: ·方法一:将整个字符串左移或右移(p - 1)次 ·方法二: 将要分成的前部分或后部分整体移动 ·方法三:利用栈 如: 先将FGH放置到前面,变成&