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

此题旋转带有技巧性,问题转化为常见的问题,熟练STL可以直接用str.find()函数,其是主要想用KMP算法实现字符串的查找算法。。。

//如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。比如A = "12345", A的旋转词有"12345", "23451", "34512", "45123"和"51234"。对于两个字符串A和B,请判断A和B是否互为旋转词。
//给定两个字符串A和B及他们的长度lena,lenb,请返回一个bool值,代表他们是否互为旋转词。
//测试样例:
//"cdab", 4, "abcd", 4
//返回:true

#include <iostream>
using namespace std;
#include <string>

class Rotation {
public:
    bool chkRotation(string A, int lena, string B, int lenb) {
        // write code here
        if (A.size()!=B.size())
        {
            return false;
        }
        A = A + A;
        int index = A.find(B); //经典的用KMP算法
        if (index!=-1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};

// KMP Algorithm
public int getIndexOf(String s, String m) {
    if (s.length() < m.length()) {
        return -1;
    }
    char[] ss = s.toCharArray();
    char[] ms = m.toCharArray();
    int si = 0;
    int mi = 0;
    int[] next = getNextArray(ms);
    while (si < ss.length && mi < ms.length) {
        if (ss[si] == ms[mi]) {
            si++;
            mi++;
        }
        else if (next[mi] == -1) {
            si++;
        }
        else {
            mi = next[mi];
        }
    }
    return mi == ms.length ? si - mi : -1;
}

public int[] getNextArray(char[] ms) {
    if (ms.length == 1) {
        return new int[] { -1 };
    }
    int[] next = new int[ms.length];
    next[0] = -1;
    next[1] = 0;
    int pos = 2;
    int cn = 0;
    while (pos < next.length) {
        if (ms[pos - 1] == ms[cn]) {
            next[pos++] = ++cn;
        }
        else if (cn > 0) {
            cn = next[cn];
        }
        else {
            next[pos++] = 0;
        }
    }
    return next;
}
时间: 2024-11-13 23:48:12

字符串旋转(str.find()---KMP)的相关文章

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

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

字符串旋转问题

字符串旋转问题:"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

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

【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

【Python】Java程序员学习Python(七)— 文本类详解(字符串、str)

如果一个女孩子喜欢看龙猫,那么请珍惜她,呵护她 任何一门语言,字符串总是最基本也是最需要掌握的一个变量,想想入门的Hello World,输出的就是字符串. 官方文档:https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str. 字符串也成为字符序列, 一.表现形式 1.1 基本表现形式 字符串可以用单引号.双引号.三引号引起来,特点如下: 单引号和双引号相似,内部如果还要使用则需要用斜杠进行转义 三引号是三个单引

PHP中常用的字符串函数str

1 字符串大小写函数 strtoupper($str) strtolower($str) 2 字符串切割函数 explode(',',$str) join(',',$str) implode(',',$str) 3 字符串长度函数 strlen($str) 4 字符串重复函数 str_repeat($str,2) 5 字符串首字符大写 ucfirst($str) 6 字符串单词首字符大写 ucwords($str) 7 去除两边指定字符 trim($str,',.?!') ltrim($str,

abcdef-&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++

python 字符串编码 str和unicode 区别以及相互转化 decode(&#39;utf-8&#39;) encode(&#39;utf-8&#39;)

python 字符串编码 str和unicode 区别以及相互转化 decode('utf-8') encode('utf-8') 原文地址:https://www.cnblogs.com/zhaoyingjie/p/9133020.html