寻找包含一个或多个给定字符串出现的最短二进制字符串

278 阅读3分钟

寻找包含一个或多个给定字符串出现的最短二进制字符串

  • 最后更新 : 2021年8月10日

给定两个二进制字符串S1S2,任务是生成一个新的二进制字符串(可能的最小长度),可以说是S1S2的一个或多个出现。如果不可能生成这样的字符串,则在输出中返回**-1**。请注意,生成的字符串不能有不完整的字符串S1或S2。

例如,**"1111 "可以是"11 "和"1111 "的结果字符串,因为它是"1111 "的1次出现,也可以被判断为"11 "**的2次出现。

例子。

输入。 S1 = "1010", S2 = "101010"
输出。 101010101010
解释。 结果字符串是3个s1的出现和2个s2的出现。

输入。 S1 = "000", S2 = "101"
输出。 -1
解释。 没有办法构建这样一个字符串。

办法。如 果有可能造出这样的字符串,那么它的长度将是字符串 S1S2的长度的LCM。因为只有这样,它才可以说是字符串 S1S2的最小倍数。按照下面的步骤来解决这个问题。

  • 定义一个函数 **repeat(int k, string S)**并执行以下任务。
  • 将变量xy初始化为字符串 S1和S2的长度**。**
  • 将变量gcd 初始化为xyGCD
  • 调用函数 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 string
string 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 it
void find(string s1, string s2)
{
int x = s1.size(), y = s2.size();
// GCD of x and y
int gcd = __gcd(x, y);
// Form the resultant strings
string A = repeat(y / gcd, s1);
string B = repeat(x / gcd, s2);
// If both the strings are same,
// then print the answer
if (A == B) {
cout << A;
}
else {
cout <<"-1";
}
}
// Driver Code
int main()
{
// Initializing strings
string 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现场课程面向学生的竞争性编程直播课程.

我的个人笔记 箭头_下降_上升

保存