透過從給定的二進位字串中選擇相等長度的子字串,最大化給定函數
給定兩個相同長度的二進位字串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脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

給定兩個字串str_1和str_2。目標是使用遞歸過程計算字串str1中子字串str2的出現次數。遞歸函數是在其定義中呼叫自身的函數。如果str1是"Iknowthatyouknowthatiknow",str2是"know"出現次數為-3讓我們透過範例來理解。例如輸入str1="TPisTPareTPamTP",str2="TP";輸出Countofoccurrencesofasubstringrecursi

MySQL中如何使用LOCATE函數來尋找子字串在字串中的位置在MySQL中,有許多函數可以用來處理字串。其中,LOCATE函數是一種非常有用的函數,可以用來尋找子字串在字串中的位置。 LOCATE函數的語法如下:LOCATE(substring,string,[position])其中,substring為要找的子字串,string為要在其中

該函數與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說明最長的非遞

這篇文章將為大家詳細講解有關PHP返回一個字符串在另一個字符串中開始位置到結束位置的字符串,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP中使用substr()函數從字串中擷取子字串substr()函數可從字串中擷取指定範圍內的字元。其語法如下:substr(string,start,length)其中:string:要從中提取子字串的原始字串。 start:子字串開始位置的索引(從0開始)。 length(可選):子字串的長度。如果未指定,則提

pack()函數將資料打包到二進位字串中。語法pack(format,args)參數格式-要使用的格式。以下是可能的值-a-NUL填充字串A-空格填充字串h-十六進位字串,低半位元組在前H-十六進位字串,高半位元組在前c-帶符號字元C-無符號字元s-帶符號短字元(始終為16位,機器字節順序)S-無符號短整型(始終為16位,機器字節順序)n-無符號短整型(始終為16位,大端字節順序)v-無符號短整型(始終為16位,小端字節順序)i-有符號整數(取決於機器的大小和字節順序)I-無符號整數(取決

在給定的問題中,我們得到一個由0和1組成的字串;我們需要找出以1開頭的所有排列的總數。由於答案可能是一個巨大的數字,所以我們將其取模1000000007後輸出。 Input:str="10101001001"Output:210Input:str="101110011"Output:56我們將透過應用一些組合數學和建立一些公式來解決這個問題。解的方法在這個方法中,我們將計算0和1的數量。現在假設n是我們字串中出現的1的數量,m是我們字串中出現的0

PHP8.1新增的str_contains函數:快速判斷子字串是否存在在最新的PHP8.1版本中,新增了一個非常方便的函數str_contains,它的作用是用來快速判斷一個字串是否包含另一個子字串。相較於先前的strpos函數,str_contains函數更加簡潔、易用,且能大幅提升開發效率。本文將向大家介紹str_contains函數的使用方法,並
