zoukankan      html  css  js  c++  java
  • 牛客笔试题---求最长重复词长度之和

      ①题目要求:

      对于两个字符串B和C,我们定义BC为将C接在B的后面形成的新串。一个字符串P是串A的前缀,当且仅当存在B使得A=PB,当然B可以为空串。若P!=A,则我们称P为A的真前缀。现在定义重复词。串Q是串A的重复词当且仅当Q是A的真前缀,且A是QQ的前缀。而A的最长重复词则是A的重复词中最长的一个,或者空串(当A没有任何重复串时)。如ababab的最长重复词是abab;abc的最长重复词是空串。

      给定一个串s(由字母组成),及它的长度n(1≤n≤100000),请返回s的所有前缀的最长重复词的长度之和(空串长度为0)。

      测试样例:
      8,"babababa"
      返回:24


    实现:
     1 #include<string>
     2 class Periods {
     3 public:
     4     long long getLongest(int n, string s) {
     5         // write code here
     6         long long    res = 0;
     7 
     8         //1求所有前缀
     9         for (int i = 0; i <= n; i++)
    10         {
    11             
    12             string subS = s.substr(0, i);        //前缀
    13 
    14             bool get = false;    //是否获得最长重复词
    15 
    16             //判断是否是重复词。//要求之一是qq 有前缀A所以长度限制
    17             for (int k = i-1; k >= i / 2; k--)
    18             {
    19                 //真前缀  i-1 保证
    20                 string subsubS = subS.substr(0, k);
    21                 
    22                 //前缀
    23                 string supS = subsubS + subsubS;
    24                 string tmp = supS.substr(0, subS.length());
    25                 if (subS == tmp)
    26                 {
    27                     get = true;
    28                     cout << subS << ":::::" << "	";
    29                     cout << subsubS << endl;
    30                     res += subsubS.length();
    31                 }
    32                 else if (get == true)break;
    33             }
    34         }
    35         return res;
    36     }
    37 };

    测试:

     1 void main()
     2 {
     3     Periods per;
     4     string s1 = "babababa";
     5     cout << per.getLongest(8, s1) << endl;
     6 
     7     s1 = "baaaba";
     8     cout << per.getLongest(6, s1) << endl;
     9 
    10     s1 = "babababaa";
    11     cout << per.getLongest(9, s1) << endl;
    12 
    13     s1 = "";
    14     cout << per.getLongest(0, s1) << endl;
    15 
    16 }

    输出:

      24

      8
      24
      0
      请按任意键继续. . .

  • 相关阅读:
    shell命令finger
    join命令
    日志记录
    shell命令xargs
    linux read 简介
    P1601 A+B Problem(高精)
    P2670 [NOIP2015 普及组] 扫雷游戏
    P1042 [NOIP2003 普及组] 乒乓球
    P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
    P5744 【深基7.习9】培训
  • 原文地址:https://www.cnblogs.com/lang5230/p/5136593.html
Copyright © 2011-2022 走看看