寻找包含一个或多个给定字符串出现的最短二进制字符串
- 最后更新 : 2021年8月10日
给定两个二进制字符串S1和S2,任务是生成一个新的二进制字符串(可能的最小长度),可以说是S1和S2的一个或多个出现。如果不可能生成这样的字符串,则在输出中返回**-1**。请注意,生成的字符串不能有不完整的字符串S1或S2。
例如,**"1111 "可以是"11 "和"1111 "的结果字符串,因为它是"1111 "的1次出现,也可以被判断为"11 "**的2次出现。
例子。
输入。 S1 = "1010", S2 = "101010"
输出。 101010101010
解释。 结果字符串是3个s1的出现和2个s2的出现。输入。 S1 = "000", S2 = "101"
输出。 -1
解释。 没有办法构建这样一个字符串。
办法。如 果有可能造出这样的字符串,那么它的长度将是字符串 S1和S2的长度的LCM。因为只有这样,它才可以说是字符串 S1和S2的最小倍数。按照下面的步骤来解决这个问题。
- 定义一个函数 **repeat(int k, string S)**并执行以下任务。
- 将变量x和y初始化为字符串 S1和S2的长度**。**
- 将变量gcd 初始化为x和y的GCD 。
- 调用函数 repeat(y/gcd, s1),将字符串 S1组成若干次,并将其存入变量A。
- 调用函数 repeat(x/gcd, s2)将字符串 S2组成那么多遍,并存入变量B中。
- 如果A等于B,则打印其中任何一个作为答案,否则打印**"NO"。**
下面是上述方法的实现。
C++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;// Function to form the resultant stringstring repeat(int k, string S){string r ="";while (k--) {r += S;}return r;}// Function to find if any such string// exists or not. If yes, find itvoid find(string s1, string s2){int x = s1.size(), y = s2.size();// GCD of x and yint gcd = __gcd(x, y);// Form the resultant stringsstring A = repeat(y / gcd, s1);string B = repeat(x / gcd, s2);// If both the strings are same,// then print the answerif (A == B) {cout << A;}else {cout <<"-1";}}// Driver Codeint main(){// Initializing stringsstring s1 ="1010", s2 ="101010";find(s1, s2);return 0;} |
输出
101010101010
时间复杂度。 O(m + n + log(max(m, n)))
辅助空间。O (n) (用于存储字符串A和B)
读者请注意!现在不要停止学习。掌握所有重要的DSA概念。 DSA自学课程以适合学生的价格掌握所有重要的DSA概念,并成为行业的准备者。 要完成从学习语言到DS Algo以及更多的准备工作,请参考 完整的面试准备课程.
如果你想参加专家的现场课程 ,请参考 面向在职人士的DSA现场课程 和 面向学生的竞争性编程直播课程.
我的个人笔记 箭头_下降_上升
保存