动态规划 
      
    
      
      
      
        字符串 
      
    
      
      
      
        字符串匹配 
      
    
   
  
    
      
       
     
  
  
    
      
    
    
      
       
     
  
    
题目描述 
给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word 的 重复值为 k   。单词 word 的 最 大重复值  是单词 word 在 sequence 中最大的重复值。如果 word 不是 sequence 的子串,那么重复值 k 为 0 。
给你一个字符串 sequence 和 word ,请你返回 最大重复值 k  。
 
示例 1: 
输入: sequence = "ababc", word = "ab"
输出: 2
解释: "abab" 是 "abab c" 的子字符串。
 
示例 2: 
输入: sequence = "ababc", word = "ba"
输出: 1
解释: "ba" 是 "aba bc" 的子字符串,但 "baba" 不是 "ababc" 的子字符串。
 
示例 3: 
输入: sequence = "ababc", word = "ac"
输出: 0
解释: "ac" 不是 "ababc" 的子字符串。
 
 
提示: 
    1 <= sequence.length <= 100 
    1 <= word.length <= 100 
    sequence 和 word 都只包含小写英文字母。 
 
解法 
方法一:直接枚举 
注意到字符串长度不超过 \(100\) ,我们直接从大到小枚举 word 的重复次数 \(k\) ,判断 word 重复该次数后是否是 sequence 的子串,是则直接返回当前的重复次数 \(k\) 。
时间复杂度为 \(O(n^2)\) ,其中 \(n\)  为 sequence 的长度。
Python3 Java C++ Go TypeScript Rust C 
class   Solution : 
    def   maxRepeating ( self ,  sequence :  str ,  word :  str )  ->  int : 
        for  k  in  range ( len ( sequence )  //  len ( word ),  - 1 ,  - 1 ): 
            if  word  *  k  in  sequence : 
                return  k 
 
 
class  Solution   { 
     public   int   maxRepeating ( String   sequence ,   String   word )   { 
         for   ( int   k   =   sequence . length ()   /   word . length ();   k   >   0 ;   -- k )   { 
             if   ( sequence . contains ( word . repeat ( k )))   { 
                 return   k ; 
             } 
         } 
         return   0 ; 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 class   Solution   { 
public : 
     int   maxRepeating ( string   sequence ,   string   word )   { 
         int   ans   =   0 ; 
         string   t   =   word ; 
         int   x   =   sequence . size ()   /   word . size (); 
         for   ( int   k   =   1 ;   k   <=   x ;   ++ k )   { 
             // C++ 这里从小到大枚举重复值 
             if   ( sequence . find ( t )   !=   string :: npos )   { 
                 ans   =   k ; 
             } 
             t   +=   word ; 
         } 
         return   ans ; 
     } 
}; 
 
 
func   maxRepeating ( sequence   string ,   word   string )   int   { 
     for   k   :=   len ( sequence )   /   len ( word );   k   >   0 ;   k --   { 
         if   strings . Contains ( sequence ,   strings . Repeat ( word ,   k ))   { 
             return   k 
         } 
     } 
     return   0 
} 
 
 
function   maxRepeating ( sequence :   string ,   word :   string ) :   number   { 
     let   n   =   sequence . length ; 
     let   m   =   word . length ; 
     for   ( let   k   =   Math . floor ( n   /   m );   k   >   0 ;   k -- )   { 
         if   ( sequence . includes ( word . repeat ( k )))   { 
             return   k ; 
         } 
     } 
     return   0 ; 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 impl   Solution   { 
     pub   fn   max_repeating ( sequence :   String ,   word :   String )   ->   i32   { 
         let   n   =   sequence . len (); 
         let   m   =   word . len (); 
         if   n   <   m   { 
             return   0 ; 
         } 
         let   mut   dp   =   vec! [ 0 ;   n   -   m   +   1 ]; 
         for   i   in   0 ..= n   -   m   { 
             let   s   =   & sequence [ i .. i   +   m ]; 
             if   s   ==   word   { 
                 dp [ i ]   =   ( if   ( i   as   i32 )   -   ( m   as   i32 )   <   0   { 
                     0 
                 }   else   { 
                     dp [ i   -   m ] 
                 })   +   1 ; 
             } 
         } 
         * dp . iter (). max (). unwrap () 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 #define max(a, b) (((a) > (b)) ? (a) : (b)) 
int   findWord ( int   i ,   char *   sequence ,   char *   word )   { 
     int   n   =   strlen ( word ); 
     for   ( int   j   =   0 ;   j   <   n ;   j ++ )   { 
         if   ( sequence [ j   +   i ]   !=   word [ j ])   { 
             return   0 ; 
         } 
     } 
     return   1   +   findWord ( i   +   n ,   sequence ,   word ); 
} 
int   maxRepeating ( char *   sequence ,   char *   word )   { 
     int   n   =   strlen ( sequence ); 
     int   m   =   strlen ( word ); 
     int   ans   =   0 ; 
     for   ( int   i   =   0 ;   i   <=   n   -   m ;   i ++ )   { 
         ans   =   max ( ans ,   findWord ( i ,   sequence ,   word )); 
     } 
     return   ans ; 
}