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

一,  旋转字符串分左旋转和右旋转,但是他们的算法基本相同。

  1.左旋字符串,第一种方法,大家一般是第一思维


#include<stdio.h>
  #include<math.h>
  #include<assert.h>
   
   void LeftX(char *lp,int num)     //num 是旋转几个字符
   {
   
      int a = 0;
   
      int b = strlen(lp);
     assert(lp!=NULL);
     while(a<num)
     {
       char *cur = lp;
     char  tmp = *lp;        //建一个临时变量存放首指针的内容
  
     while((*(cur+1))!='\0')    //后面那个指针指向的内容为‘\0’的话停止   
     {
            *cur=*(cur+1);
             cur++;
  
    }
           *( cur)=tmp;
                                                              
   a++;
 }
  }
  
    int main()
   {
      int num = 0;
       int len = 0;
       char arr[20]="ABCDEF";
          len  =  strlen(arr);
      printf("please input number:");
       while(1)
  {
        scanf("%d",&num);
        if(num>len)
      {
        printf("error");
        }
else
        LeftX(arr,num);
    printf("%s\n",arr);
     break;
 }
       return 0;
  }

2. 第二种算法  (左旋,右旋基本类似,不在重复)

      三步翻转法:1.旋转需要旋转的前几个字符

                         2.旋转后几个字符

                         3.整体旋转

#include<stdio.h>
   #include<math.h>
   void reverse(char *str,char *cur)
   {
      while(str<cur)
      {
          char tmp =*str;
         *str=*cur;
         *cur= tmp;
       str++;
         cur--;
     }
  }
  void left_move(char *p,int num)
  {
       int a = strlen(p);
      reverse(p,p+num-1);
       reverse(p+num,p+a-1);
       reverse(p,p+a-1);
 }
  int main()
  {
      char arr[]= "ABCDEF";
 int num = 0;
    printf("please input:");
      scanf("%d",&num);
       left_move(arr,num);
     printf("%s",arr);
 
    return 0;
 }

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

   可以用库函数里的strncat和strstr,这里是我自己写的。

#include<stdio.h>
 #include<math.h>
 #include<assert.h>
#include<windows.h>
  int my_strlen(char const*str)             // const 修饰的 *str   指针所指向的内容不能改变
   {
         int count = 0;
       assert(str!=NULL);               //断言一下,str不能是空指针,不然程序会崩溃
         while(*str++)
      {                 
           count++;
     }
        return count;
  }
  void my_strncat(char *dst,char*str1,int len)
  {   
	    
        assert(dst!=NULL);
       assert(str1!=NULL);
          while(*dst)
         {      dst++;
          }                     
      while(len--)
   {
      *dst++ = *str++;
    }
      *dst='\0';
 char * my_strstr(char *str,char *p)
  {
  
       char * cur=str;
      assert(str!=NULL);
      assert(p!=NULL):
       while((*cur)!='\0')
     {
             char *current=cur;
              char *ret=p;
         while(*current==*ret)
          {
                 current++;
                  ret++;
                 if((*ret)=='\0')
                  return cur;
            }
           cur++;
     }
  
       return NULL;
  }

int is_move(char*str,char *p)
 {
       int len =my_strlen(str);
      int a = my_strlen(p);
	    char *p1=NULL;
       assert(str!=NULL);            
      assert(p!=NULL);
      my_strncat(str,str,len);
	  p1= my_strstr(str,p);
        if(a!=len)
      {
        return 0;
      }
  
           if(p1!=NULL)
          return 1;
       return 0;
  }
int main()
  {
      int ret = 0;
     char arr[20]="ABCDEF";
     char*p = "DEAFBC";
     ret = is_move(arr,p);
      if(ret == 0)
    {
       printf("not remove\n");
      return 0;
     }
   else
     printf("move\n");
	  
	  system("pasuse");
       return 1;
  }}
好了,就到这里了,有什么问题可以给我留言哦


猜你喜欢

转载自blog.csdn.net/congjichukaishi/article/details/80247007