【死磕算法·字符串问题】旋转字符串2

题目大意:

给定一个字符串str和整数i,i代表str中的位置,将str[0,...i]移到str的右侧,str[i+1,...length-1]移动到str的左侧。

如“ABCDE”,i =2,变化结果为“DEABC”

要求:时间复杂度为O(N),空间复杂度为O(1)

之前一篇博客提到如何判断字符串str2是字符串str1的旋转字符串。本题也可以采用将str拼接之后,按照i取子串的方法,这样需要额外空间复杂度为O(N),不满足题目的要求。

空间复杂度为O(1),需要在字符串原地进行调整。

思路:

1、给定字符串str,对str[0,...i-1]逆序处理,str[i+1,length-1]逆序处理

2、在1的基础上对整个字符串做逆序处理。

详见下图:

大多数字符串交换可以通过字符串局部逆序来组合实现。

代码实现(c++)版本:

class Rotation {
public:
    int next[200];
  
    void getnext(string B, int lenb){
        int i = 0;int j = -1;  next[0] = -1;
        while(i<lenb){
           if(j==-1 || B[i] == B[j]){
            i++;
            j++;
            next[i] = j;
         } 
           else
            j = next[j];
        }
        
    }
    int kmp(string A, int lena, string B, int lenb){
        getnext(B,lenb);
        int i = 0;int j = 0;
        while(i<lena && j<lenb){
           if( j ==-1 || A[i] == B[j]){
            i++;
            j++;
        }
        else
            j = next[j];
        }
      if(j ==lenb)
          return (i-j);
      else
          return -1;
    }
    bool chkRotation(string A, int lena, string B, int lenb) {
        // write code here
        if(lena !=lenb)
            return false;
        string A2 = A+A;
        lena = 2*lena;
        if(kmp(A2,lena,B,lenb)!=-1)
            return true;
        else
            return false;
    }
};

其中注意要先判断lena和lenb是否相等,这样能减少一部分运算复杂度。

猜你喜欢

转载自blog.csdn.net/gulaixiangjuejue/article/details/85011511