在這個問題中,我們需要找到給定字串的最長非遞增子序列。
非遞增的意思是字元要麼相同,要麼按降序排列。由於二進位字串僅包含“0”和“1”,因此產生的字串應以“1”開頭並以“0”結尾,或以“0”或“1”開頭和結尾。
為了解決這個問題,我們將統計字串每個位置的前綴“1”和後綴“0”,並找到前綴“1”和後綴“0”的最大和。
問題陳述 - 我們給了二進位字串 str。我們需要從給定的字串中找到最長的非遞增子序列。
範例
Input – str = "010100"
Output – 4
說明
最長的非遞增子序列是「1100」。
Input – str = "010110010"
Output – 6
說明
最長的非遞增子序列是「111000」。
Input – str = ‘00000000’
Output – 8
說明
最長的非遞增子序列是‘00000000’,它等於給定的字串。
方法 1
在這個方法中,我們將在陣列中為每個索引儲存前綴「1」和後綴「0」的計數。之後,我們從兩個陣列中的相同索引取得值,將它們相加,並找到最大總和。
演算法
步驟 1 - 定義 pre1s 和 suffix0s 陣列來儲存前綴 1 和後綴 0。另外,將所有數組元素初始化為 0。
步驟 2 - 使用 for 迴圈遍歷字串並計算每個索引的前綴 1。如果我> 0,則將前一個元素的值加到目前元素。
步驟 3 - 如果目前字元為“1”,則將 pre1s[i] 的目前值加 1。
第 4 步 - 現在,計算給定字串中的後綴 0。從末尾開始遍歷字串。
步驟 5 - 如果“I”的值不等於“n – 1”,則取得“I 1”元素的值並將其新增至目前元素。
第 6 步 - 如果目前元素為“0”,則向目前元素加 1。
第 7 步 - 現在,用 0 初始化「res」變數。
第 8 步 - 使用循環迭代“pre1s”和“suffix0s”。
第 9 步 - 從「pre1s」和「suffix0s」陣列中的第 i 個索引取得值,並將它們相加。另外,如果「sum」大於「res」變數的目前值,則用「sum」值來變更「res」變數值。
第 10 步 - 傳回「res」變數的值。
範例
對於輸入‘010100’,前綴數組為 [0, 1, 1, 2, 2, 2],後綴 0 數組為 [4, 3, 3, 2, 2, 1]。 sum 陣列將為 [4, 4, 4, 4, 4, 1],sum 陣列中的最大值為 4。因此,答案將為 4。
#include <bits/stdc++.h> using namespace std; int getMaxLength(string str, int n){ // To store the prefix count of '1's and suffix count of '0's int pre1s[n] = {0}, suffix0s[n] = {0}; for (int i = 0; i < n; i++){ // get the prefix count of '1's if (i > 0){ pre1s[i] += pre1s[i - 1]; } // If the current character is '1', then update the pre1s array by adding 1; else, keep it as it is. if (str[i] == '1'){ pre1s[i] += 1; } } // get suffix count of '0's for (int i = n - 1; i >= 0; i--) { // add the suffix count of '0's if (i != n - 1) suffix0s[i] += suffix0s[i + 1]; // If the current character is '0', then update the suffix0s array by adding 1; else, keep it as it is. if (str[i] == '0') suffix0s[i] += 1; } // to store the final result value int res = 0; // iterate over the pre1s[] and suffix0s[] array and find the maximum value of pre1s[i] + suffix0s[i] for (int i = 0; i < n; i++){ res = max(res, pre1s[i] + suffix0s[i]); } // Return the result return res; } // Driver Code int main(){ string str = "010100"; int N = str.length(); cout << "The length of the longest non-increasing subsequence in the given binary string is - " << getMaxLength(str, N); return 0; }
輸出
The length of the longest non-increasing subsequence in the given binary string is - 4
時間複雜度 - O(N),因為我們需要初始化前綴 1 和後綴 0 的陣列。
空間複雜度 - O(N),因為我們將前綴 1 和後綴 0 儲存在陣列中
方法2
在這種方法中,我們將首先計算零的總數。之後,我們開始遍歷字串,繼續計算“1”,如果找到 0,則減少“0”。此外,我們在每次迭代中將 0 和 1 的計數相加,並找到最大結果值。
演算法
第1 步 - 定義'count1'、'count0' 和'res' 變量,並用0 初始化它們,分別儲存1、0 的計數和最終結果.
第 2 步 - 透過遍歷字串並將其儲存在「count0」變數中來計算零的總數。
第 3 步 - 現在,使用循環迭代字串。
-
步驟4 - 在循環中,如果目前字元為“1”,則將“count1”的值增加1,否則將“count0”的值減少1.
第 5 步 - 另外,將「res」和「count0 count1」中的最大值儲存到「res」變數中。
第 6 步 - 當迴圈終止時,傳回「res」變數的值。
範例
#include <bits/stdc++.h> using namespace std; int getMaxLength(string str, int n){ int count1 = 0, count0 = 0; int res = 0; // counting total zeros in the string for (int i = 0; i < n; i++){ if (str[i] == '0') count0++; } // counting 1s from left, subtracting zeros from total zeros and adding both counts. for (int i = 0; i < n; i++){ if (str[i] == '1') count1++; else count0--; res = max(res, count1 + count0); } return res; } int main(){ string str = "010110010"; int N = str.length(); cout << "The length of the longest non-increasing subsequence in the given binary string is - " << getMaxLength(str, N); return 0; }
輸出
The length of the longest non-increasing subsequence in the given binary string is - 6
時間複雜度 - O(N),因為我們計算字串中零的總數並遍歷字串以找到最長的子序列。
空間複雜度 - O(1)
結論
這裡,兩種方法具有相同的時間複雜度但不同的空間複雜度。第二種方法在我們優化程式碼時使用常數空間,但第一種方法使用動態空間來儲存前綴 1 和後綴 0 的總數。
以上是最長非遞增子序列在一個二進位字串中的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C#和C 在面向对象编程(OOP)中的实现方式和特性上有显著差异。1)C#的类定义和语法更为简洁,支持如LINQ等高级特性。2)C 提供更细粒度的控制,适用于系统编程和高性能需求。两者各有优势,选择应基于具体应用场景。

從XML轉換到C 並進行數據操作可以通過以下步驟實現:1)使用tinyxml2庫解析XML文件,2)將數據映射到C 的數據結構中,3)使用C 標準庫如std::vector進行數據操作。通過這些步驟,可以高效地處理和操作從XML轉換過來的數據。

C#使用自動垃圾回收機制,而C 採用手動內存管理。 1.C#的垃圾回收器自動管理內存,減少內存洩漏風險,但可能導致性能下降。 2.C 提供靈活的內存控制,適合需要精細管理的應用,但需謹慎處理以避免內存洩漏。

C 在現代編程中仍然具有重要相關性。 1)高性能和硬件直接操作能力使其在遊戲開發、嵌入式系統和高性能計算等領域佔據首選地位。 2)豐富的編程範式和現代特性如智能指針和模板編程增強了其靈活性和效率,儘管學習曲線陡峭,但其強大功能使其在今天的編程生態中依然重要。

C 學習者和開發者可以從StackOverflow、Reddit的r/cpp社區、Coursera和edX的課程、GitHub上的開源項目、專業諮詢服務以及CppCon等會議中獲得資源和支持。 1.StackOverflow提供技術問題的解答;2.Reddit的r/cpp社區分享最新資訊;3.Coursera和edX提供正式的C 課程;4.GitHub上的開源項目如LLVM和Boost提陞技能;5.專業諮詢服務如JetBrains和Perforce提供技術支持;6.CppCon等會議有助於職業

C#適合需要高開發效率和跨平台支持的項目,而C 適用於需要高性能和底層控制的應用。 1)C#簡化開發,提供垃圾回收和豐富類庫,適合企業級應用。 2)C 允許直接內存操作,適用於遊戲開發和高性能計算。

C 持續使用的理由包括其高性能、廣泛應用和不斷演進的特性。 1)高效性能:通過直接操作內存和硬件,C 在系統編程和高性能計算中表現出色。 2)廣泛應用:在遊戲開發、嵌入式系統等領域大放異彩。 3)不斷演進:自1983年發布以來,C 持續增加新特性,保持其競爭力。

C 和XML的未來發展趨勢分別為:1)C 將通過C 20和C 23標準引入模塊、概念和協程等新特性,提升編程效率和安全性;2)XML將繼續在數據交換和配置文件中佔據重要地位,但會面臨JSON和YAML的挑戰,並朝著更簡潔和易解析的方向發展,如XMLSchema1.1和XPath3.1的改進。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

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

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