zoukankan      html  css  js  c++  java
  • 判断一个字符串是否由另一个字符串旋转而成

    if s1 = "stackoverflow" then the following are some of its rotated versions:

    "tackoverflows"
    
    "ackoverflowst"
    "overflowstack"

    where as "stackoverflwo" is not a rotated version.

    通常的做法
    algorithm checkRotation
    ( string s1 , string s2 )
     
    if ( len ( s1 ) != len ( s2 ))
       
    return false
     
    if ( substring ( s2 , concat ( s1 , s1 ))
       
    return true
     
    return false
    end



    一个基于KMP的解决方案
    bool is_rotation ( const string & str1 , const string & str2 )
    {
     
    if ( str1 . size ()!= str2 . size ())
       
    return false ;

      vector
    <size_t> prefixes ( str1 . size (), 0 );
     
    for ( size_t i = 1 , j = 0 ; i < str1 . size (); i ++) {
       
    while ( j > 0 && str1 [ i ]!= str1 [ j ])
          j
    = prefixes [ j - 1 ];
       
    if ( str1 [ i ]== str1 [ j ]) j ++;
        prefixes
    [ i ]= j ;
     
    }

      size_t i
    = 0 , j = 0 ;
     
    for (; i < str2 . size (); i ++) {
       
    while ( j > 0 && str2 [ i ]!= str1 [ j ])
          j
    = prefixes [ j - 1 ];
       
    if ( str2 [ i ]== str1 [ j ]) j ++;
     
    }
     
    for ( i = 0 ; i < str2 . size (); i ++) {
       
    if ( j >= str1 . size ()) return true ;
       
    while ( j > 0 && str2 [ i ]!= str1 [ j ])
          j
    = prefixes [ j - 1 ];
       
    if ( str2 [ i ]== str1 [ j ]) j ++;
     
    }

     
    return false ;
    }


    c版本
    int is_rotation ( char * s1 , char * s2 )
    {
     
    char * tmp1 ;
     
    char * tmp2 ;
     
    char * ref2 ;

     
    assert ( s1 && s2 );
     
    if (( s1 == s2 ) || ( strcmp ( s1 , s2 ) == 0 ))
       
    return ( 1 );
     
    if ( strlen ( s1 ) != strlen ( s2 ))
       
    return ( 0 );

     
    while (* s2 )
       
    {
          tmp1
    = s1 ;
         
    if (( ref2 = strchr ( s2 , * s1 )) == NULL )
           
    return ( 0 );
          tmp2
    = ref2 ;
         
    while (* tmp1 && (* tmp1 == * tmp2 ))
           
    {
             
    ++ tmp1 ;
             
    ++ tmp2 ;
             
    if (* tmp2 == '/0' )
                tmp2
    = s2 ;
           
    }
         
    if (* tmp1 == '/0' )
           
    return ( 1 );
         
    else
           
    ++ s2 ;
       
    }
     
    return ( 0 );
    }

  • 相关阅读:
    程序相关概念
    C/C++程序语言概念
    详解QT5.10.0搭载OpenCV3.4.0环境配置步骤说明
    微信小程序支付结果 c#后台回调
    信小程序支付(C#后台+前台)
    微信小程序知识集锦
    WPF获取读取电脑指定文件夹中的指定文件的地址
    WPF后台动画DoubleAnimation讲解
    wpf datagrid 的单元格内容超出列宽度
    WPF实现3D翻转的动画效果
  • 原文地址:https://www.cnblogs.com/IS2120/p/6746053.html
Copyright © 2011-2022 走看看