796. 旋转字符串

796. 旋转字符串

题目链接:796. 旋转字符串

题目描述

给定两个字符串, A 和 B。

A 的旋转操作就是将 A 最左边的字符移动到最右边。 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。如果在若干次旋转操作之后,A 能变成B,那么返回True。

  • AB 长度不超过 100

思路分析

KMP算法,移动字符,可以通过拼接字符串来实现,拿题目中的A=“abcde”举例子,T=A+A=“abcdeabcde”,那么原来是(abcde)abcde,旋转一次变成a(bcdea)bcde,旋转两次同理,那么原问题就变成在T中是否有匹配字符子串B,变成了字符串匹配问题。

注意两个串长度不一样那么肯定返回false,如果是空串,那么返回true

代码实现

class Solution {
public:
    bool rotateString(string s, string goal) {
        
        string t=s+s;
        string q=goal;
        int qlen=q.size();
        int tlen=t.size();
        //判断两串长度是否相等
        if(qlen*2!=tlen)
            return false;
        //判断是否是空串
        if(!qlen)
            return true;
        //求next数组
        vector<int>next(qlen,-1);
        for(int i=1,j=-1;i<qlen;i++)
        {
            while(j>-1&&q[i]!=q[j+1])j=next[j];
            if(q[i]==q[j+1])j++;
            next[i]=j;
        }
        //匹配过程
        for(int i=0,j=-1;i<tlen;i++)
        {
            while(j>-1&&t[i]!=q[j+1])j=next[j];
            if(t[i]==q[j+1])j++;
            if(j==qlen-1)
                return true;
        }
        return false;

    }
};
上一篇:@linux硬件时间设置


下一篇:mysql数据库备份与恢复