左神算法进阶班1_1添加最少字符得到原字符N次

Posted zzw1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左神算法进阶班1_1添加最少字符得到原字符N次相关的知识,希望对你有一定的参考价值。


Problem:
  给定一个字符串str1,只能往str1的后面添加字符变成str2。

  要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头。

  要求2:str2尽量短最终返回str2

  举例:

    str1 = 123,str2 = 123123 时,包含两个str1,且不以相同位置开头,且str2最短。

    str1 = 123123,str2 = 123123123 时,包含两个str1,且不以相同位置开头,且str2最短。

    str1 = 111,str2 = 1111 时,包含两个str1,且不以相同位置开头,且str2最短。

 

Solution:
  使用KMP算法;

  求最后一个字符的后一个空位的最长相同前后缀长度, 然后将字符前面不属于相同部分添加N次就行

 

Code:

  

 1 #pragma once
 2 #include <iostream>
 3 #include <vector>
 4 #include <string>
 5 
 6 using namespace std;
 7 
 8 void getIndex(int*& index, string str)
 9 
10     for (int i = 0, p = 0; i <= str.length(); ++i)
11     
12         if (i == 0)
13             index[i] = -1;
14         else if (i == 1)
15             index[i] = 0;
16         else
17         
18             if (str[i - 1] == str[p])
19                 index[i] = ++p;
20             else if (p > 0)
21                 p = index[p];
22             else
23                 index[i] = 0;
24         
25     
26 
27 
28 string addStr(string str, int N)
29 
30     string res = str;
31     int* index = new int[str.size() + 1];
32     getIndex(index, str);//获取最长前后缀角标
33 
34     int L = str.length() - index[str.length()];//最后一个位置的前后缀长度
35     for (int i = 1; i < N; ++i)
36     
37         for (int j = 0; j < L; ++j)
38             res += str[j];
39     
40     delete[] index;
41     return res;
42 
43 
44 
45 void Test()
46 
47     string str;
48     str = "abcabc";
49     cout << addStr(str, 3) << endl;
50 
51     str = "12345";
52     cout << addStr(str, 2) << endl;
53 

 

以上是关于左神算法进阶班1_1添加最少字符得到原字符N次的主要内容,如果未能解决你的问题,请参考以下文章

左神算法进阶班1_5BFPRT算法

左神算法进阶班5_3求公司的最大活跃度

左神算法进阶班5_1求二叉树中最大搜索子树大小

左神算法进阶班6_1LFU缓存实现

左神算法书籍《程序员代码面试指南》——2_06判断一个链表是否为回文结构

左神算法基础班3_13深度拷贝含有随机指针的链表