通过从给定的二进制字符串中选择相等长度的子字符串,最大化给定函数
给定两个相同长度的二进制字符串 str1 和 str2,我们必须通过从给定的相同长度的字符串中选择子字符串来最大化给定的函数值。给定的函数是这样的 -
fun(str1, str2) = (len(子字符串))/(2^xor(sub1, sub2))。
这里,len(substring) 是第一个子字符串的长度,而 xor(sub1, sub2) 是给定子字符串的异或,因为它们是二进制字符串,所以这是可能的。
示例
Input1: string str1 = 10110 & string str2 = 11101
Output: 3
说明
我们可以选择许多不同的字符串集来找到解决方案,但从两个字符串中选择“101”将使异或为零,这将导致函数返回最大值。
Input2: string str1 = 11111, string str2 = 10001
Output: 1
说明
我们可以选择“1”作为子字符串,这将导致此输出,如果我们选择任何其他字符串,则会产生较低的值。
天真的方法
在这种方法中,我们将找到所有子字符串,然后比较它们以找到解决方案,但这种解决方案效率不高,并且会花费大量时间和空间复杂度。
生成长度 x 平均时间复杂度的子串是 N^2,然后比较每个子串将花费 N^2 多。另外,我们还必须找到给定子字符串的异或,这也会花费额外的 N 因子,这意味着 N^5 将是上述代码的时间复杂度,效率非常低。
高效的方法
想法
这里的想法来自于一个简单的观察,即随着异或值变高,它总是会减少答案。因此,为了最大化函数返回值,我们必须尽可能减少异或值。
在两个子串都为零的情况下,可以实现的最小 XOR 值为零。所以,这个问题实际上是由最长公共子串问题衍生出来的。
当异或为零时,被除数部分为1,因此最终答案将是最大公共子串的长度。
实施
我们已经看到了解决问题的想法,让我们看看实现代码的步骤 -
我们将创建一个函数,它将接受两个给定的字符串作为输入并返回整数值,这将是我们的最终结果。
在函数中,我们首先获取字符串的长度,然后创建一个与给定字符串相乘的大小的二维向量。
我们将使用嵌套的 for 循环来遍历字符串并获取最大的公共子字符串。
在每次迭代时,我们将检查两个字符串的当前索引是否匹配,然后我们将从两个字符串的最后一个索引的向量中获取值。
否则,我们只会将向量的当前索引设为零。
此外,我们将维护一个变量来维护公共子字符串最大长度的计数。
最后,我们将返回答案并在主函数中打印它。
示例
#include <bits/stdc++.h> using namespace std; // function to get the result int result(string str1, string str2){ int n = str1.length(); // size of the first string int m = str2.length(); // size of the second string // creating vector to store the dynamic programming results vector<vector<int>>dp(n+1, vector<int>(m+1)); int ans = 0; // variable to store the result // traversing over the strings using nested for loops for (int i = 1; i <= n; i++){ for (int j = 1; j <= m; j++){ // if current elements of both the string are equal if (str1[i - 1] == str2[j - 1]){ // getting one maximum of the last two dp[i][j] = 1 + dp[i - 1][j - 1]; ans = max(ans, dp[i][j]); } } } return ans; // return the final answer or count } int main(){ string str1 = "10110"; string str2 = "11101"; // calling the function cout<<"The maximum score for a given function by selecting equal length substrings from given binary strings is "<< result(str1,str2)<<endl; return 0; }
输出
The maximum score for a given function by selecting equal length substrings from given binary strings is 3
时间和空间复杂度
上述代码的时间复杂度为 O(N^2),因为我们使用嵌套的 for 循环,每次迭代 N 次。
由于我们使用二维数组来存储元素,因此上述代码的空间复杂度为 O(N^2)。
结论
在本教程中,我们通过从给定的二进制字符串中选择等长的子字符串来实现给定函数的最大分数的代码。我们已经讨论过这种幼稚的方法,这种方法效率极低。根据给定的函数,异或的值越小,因此我们通过在O(N^2)时间复杂度内获取最长公共子串来使异或为零。
以上是通过从给定的二进制字符串中选择相等长度的子字符串,最大化给定函数的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

MySQL中如何使用LOCATE函数查找子字符串在字符串中的位置在MySQL中,有许多函数可以用来处理字符串。其中,LOCATE函数是一种非常有用的函数,可以用来查找子字符串在字符串中的位置。LOCATE函数的语法如下:LOCATE(substring,string,[position])其中,substring为要查找的子字符串,string为要在其中

给定两个字符串str_1和str_2。目标是使用递归过程计算字符串str1中子字符串str2的出现次数。递归函数是在其定义中调用自身的函数。如果str1是"Iknowthatyouknowthatiknow",str2是"know"出现次数为-3让我们通过示例来理解。例如输入str1="TPisTPareTPamTP",str2="TP";输出Countofoccurrencesofasubstringrecursi

该函数与strtok()函数类似。唯一的关键区别是_r,它被称为可重入函数。可重入函数是在执行过程中可以被中断的函数。这种类型的函数可用于恢复执行。因此,可重入函数是线程安全的,这意味着它们可以安全地被线程中断,而不会造成任何损害。strtok_r()函数有一个称为上下文的额外参数。这样函数就可以在正确的位置恢复。strtok_r()函数的语法如下:#include<string.h>char*strtok_r(char*string,constchar*limiter,char**

在这个问题中,我们需要找到给定字符串的最长非递增子序列。非递增的意思是字符要么相同,要么按降序排列。由于二进制字符串仅包含“0”和“1”,因此生成的字符串应以“1”开头并以“0”结尾,或者以“0”或“1”开头和结尾。为了解决这个问题,我们将统计字符串每个位置的前缀“1”和后缀“0”,并找到前缀“1”和后缀“0”的最大和。问题陈述-我们给出了二进制字符串str。我们需要从给定的字符串中找到最长的非递增子序列。示例Input–str="010100"Output–4说明最长的非递

在给定的问题中,我们得到一个由0和1组成的字符串;我们需要找到以1开头的所有排列的总数。由于答案可能是一个巨大的数字,所以我们将其取模1000000007后输出。Input:str="10101001001"Output:210Input:str="101110011"Output:56我们将通过应用一些组合数学和建立一些公式来解决这个问题。解决方案的方法在这个方法中,我们将计算0和1的数量。现在假设n是我们字符串中出现的1的数量,m是我们字符串中出现的0

pack()函数将数据打包到二进制字符串中。语法pack(format,args)参数格式-要使用的格式。以下是可能的值-a-NUL填充字符串A-空格填充字符串h-十六进制字符串,低半字节在前H-十六进制字符串,高半字节在前c-带符号字符C-无符号字符s-带符号短字符(始终为16位,机器字节顺序)S-无符号短整型(始终为16位,机器字节顺序)n-无符号短整型(始终为16位,大端字节顺序)v-无符号短整型(始终为16位,小端字节顺序)i-有符号整数(取决于机器的大小和字节顺序)I-无符号整数(取决

正则表达式是一种强大的文本处理工具,它可以用来匹配特定模式的字符串。在PHP中,正则表达式常用于字符串处理、表单验证、搜索和替换等方面。本文将介绍如何使用PHP的正则表达式从字符串中提取特定字符到结尾的子字符串。首先,让我们看一个例子。假设我们有一个字符串$str,其中包含多个以“http://”开头的URL,我们想要提取这些URL,并存储在一

在本教程中,我们需要解决给定字符串的回文子串查询。解决回文子串查询比解决C++中的常规查询复杂得多。它需要更复杂的代码和逻辑。在本教程中,我们提供了字符串str和Q个子字符串[L...R]查询,每个查询都有两个值L和R。我们的目标编写一个程序来解决查询以确定substring[L...R]是否是回文。我们必须确定在L到R范围内形成的子串是否是回文来解决每个查询。例如-Let'sinput"abbbabaaaba"asourinputstring.Thequer
