C++程式:找到具有相同左右旋轉的數字的最長子序列
在這個問題中,我們需要找到左右旋轉相同的子序列的最大長度。左旋轉是指將字串中的所有字元向左移動,並將末尾的第一個字元移動。右旋轉意味著將所有字串字元向右移動,並將最後一個字元移到開頭。
問題陳述 – 我們給定了包含數字的字串str,需要找到左右旋轉相同的最大長度的子序列。
範例
輸入-str =“323232”,
輸出– 6
解釋 – 左右旋轉相同的最長子序列是「323232」。左旋轉為‘232323’,右旋轉為‘232323’。
輸入-str = ‘00010100’
輸出– 6
說明 – 左右旋轉相同的最長子序列是「000000」。
輸入-str = ‘092312110431010’
輸出– 6
解釋 – 有 2 個可能的長度為 6 且左右旋轉相同的子序列。第一個是“010101”,第二個是“101010”。
方法 1
在這種方法中,我們將找到給定字串的所有可能的子序列。之後,我們將檢查字串的左右旋轉是否相同。我們將使用遞歸方法來查找所有可能的子序列。
演算法
將「maxLen」全域變數初始化為零,以儲存左右旋轉相同的最長子序列的長度。
定義 isRightSameLeft() 函數來檢查字串左右旋轉是否相同。
在函數內部,使用 substr() 方法左右旋轉字串。
getAllSubSeq() 函數用於尋找給定字串的所有可能的子序列。
定義基本情況。如果str為空,我們取得子序列並執行isRightSameLeft()函數來檢查子序列是否具有相同的左右旋轉。如果是,如果「maxLen」變數的長度大於「maxLen」的目前值,則更新「maxLen」變數的值。
從「str」中刪除第一個字元並附加「out」字串後進行遞歸呼叫。
刪除第一個字元並保持「out」字串不變後,再次進行遞歸函數呼叫。在此遞歸呼叫中,我們排除“str”的第一個字元。
範例
#include <iostream> #include <string> using namespace std; // Defining global variable to store the length of the longest subsequence according to the given condition int maxLen = 0; // function to check if the string is the same after the left rotation bool isRightSameLeft(string str) { int len = str.length(); return str.substr(1, len - 1) + str[0] == str[len - 1] + str.substr(0, len - 1); } // function to get all subsequences of a string void getAllSubSeqs(string str, string out) { // If the string is empty, we get the subsequences. Check if its left and right rotation is the same if (str.empty()) { if (isRightSameLeft(out)) maxLen = max(maxLen, (int)out.length()); return; } // Recursive case remove the first character from str, and add it to the output getAllSubSeqs(str.substr(1), out + str[0]); // remove the first character from str, and drop it if (str.length() > 1) getAllSubSeqs(str.substr(1), out); } int main() { string str = "323232"; string out = ""; getAllSubSeqs(str, out); cout << "The longest subsequence of str having same left and right rotation is " << maxLen; return 0; }
輸出
The longest subsequence of str having same left and right rotation is 6
時間複雜度 - O(N*2N)。這裡 O(N) 用於比較左右旋轉,O(2N) 用來尋找所有可能的子序列。
空間複雜度 - O(1),因為我們不使用額外的空間。
方法2
這裡,我們對上面的方法進行了最佳化。我們可以觀察樣本輸入的解決方案。只有當子序列包含相同字元或交替包含兩個不同字元且長度為偶數時,子序列的左右旋轉才相同。
演算法
使用兩個巢狀迴圈來組合任兩個數字。
定義‘cnt’變數來找出交替包含兩個數字的子序列的長度,並初始化為零。
定義布林類型的「first」變數來追蹤下一個字元應該是第i個還是第j個。
使用循環遍歷字串。
如果first == true且str[k] - '0' == I,則交替'first'的值並將'cnt'增加1。
如果first == false且str[k] - '0'== j,則再次交替'first'的值並將'cnt'增加1。
如果 i 和 j 不相等,且「cnt」值為奇數,則將其減 1。
如果 cnt 值大於“res”,則更新“res”變數的值。
範例
#include <bits/stdc++.h> using namespace std; int getLongSubSeq(string str) { // Store the length of the string int len = str.size(), res = 0; // Traverse the all possible combination of two digits for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { // to store the length of an alternating sequence of the current combination int cnt = 0; // to track the turn of the ith or jth digit bool first = true; // traverse the string for (int k = 0; k < len; k++) { // If the current digit is equal to I, and the first is true, increment the count if (first == true and str[k] - '0' == i) { first = false; cnt++; } else if (first == false and str[k] - '0' == j) { // If the current digit is equal to j, and the first is false, increment the count first = true; cnt++; } } // If the sequence is odd and i and j are different, decrement the count if (i != j and cnt % 2 == 1) cnt--; // Update the answer res = max(cnt, res); } } return res; } int main() { string str = "00010100"; cout << "The longest subsequence of str having same left and right rotation is " << getLongSubSeq(str); return 0; }
輸出
The longest subsequence of str having same left and right rotation is 6
時間複雜度 - O(10*10*N),因為我們從包含數字組合的字串中找到子序列。
空間複雜度 - O(1),因為我們不使用動態空間。
本教學教我們兩種方法來找出包含相同左右旋轉的最長子序列。第一種方法是簡單的方法,這種方法非常耗時,而且我們不能將其用於大量輸入。
第二種方法經過最佳化,其時間複雜度幾乎等於 O(N)。
以上是C++程式:找到具有相同左右旋轉的數字的最長子序列的詳細內容。更多資訊請關注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)

熱門話題

小紅書作為一個生活方式分享平台,越來越多的用戶選擇在這裡發布自己的影片內容,與其他用戶分享生活點滴。許多用戶在發布影片時,可能會遇到一個問題:如何查看自己或他人發布影片的時間?一、如何查看小紅書發布影片的時間? 1.查看自己發布影片的時間要查看自己發布影片的時間,首先要開啟小紅書應用程式並登入個人帳號。在個人主頁介面下方,會有一個標有「創作」字樣的選項,點擊進入後,會看到一個名為「影片」的欄位。在這裡,你可以瀏覽所有已發布的影片列表,並輕鬆查閱發佈時間。每個影片的右上角都有一個「查看詳情」按鈕,點擊後

待機是一種鎖定螢幕模式,當iPhone插入充電器並以水平(或橫向)方向定位時啟動。它由三個不同的螢幕組成,其中一個是全螢幕時間顯示。繼續閱讀以了解如何變更時鐘的樣式。 StandBy的第三個畫面顯示各種主題的時間和日期,您可以垂直滑動。某些主題也會顯示其他訊息,例如溫度或下一個鬧鐘。如果您按住任何時鐘,則可以在不同的主題之間切換,包括數位、類比、世界、太陽能和浮動。 Float以可自訂的顏色以大氣泡數字顯示時間,Solar具有更多標準字體,具有不同顏色的太陽耀斑設計,而World則透過突出顯示世界地

筆記型電腦打不出1-9數字是設定問題導致的,其解決方法:1、按下「win+r」開啟運行輸入cmd並回車;2、在命令提示字元介面,輸入osk並回車; 3.點擊虛擬鍵盤上的“選項”,並勾選“開啟數字鍵盤”;4、啟動“numlock鍵”即可。

產生隨機數或字母數字字串的能力在許多情況下都會派上用場。您可以使用它在遊戲中的不同位置生成敵人或食物。您也可以使用它向用戶建議隨機密碼或建立文件名來保存文件。我寫了一篇關於如何在PHP中產生隨機字母數字字串的教學。我在這篇文章的開頭說,幾乎沒有事件是真正隨機的,同樣的情況也適用於隨機數或字串生成。在本教程中,我將向您展示如何在JavaScript中產生偽隨機字母數字字串。在JavaScript中產生隨機數字讓我們從產生隨機數開始。我想到的第一個方法是Math.random(),它回傳一個浮

在任何語言中編寫程式時,將數字表示為輸出是一項有趣且重要的任務。對於整數類型(short、long或medium類型的資料),很容易將數字表示為輸出。對於浮點數(float或double類型),有時我們需要將其四捨五入到特定的小數位數。例如,如果我們想將52.24568表示為三位小數,需要進行一些預處理。在本文中,我們將介紹幾種技術,透過四捨五入將浮點數表示為特定的小數位數。在不同的方法中,使用類似C的格式化字串、使用精度參數以及使用數學函式庫中的round()函數是很重要的。讓我們逐一來看。帶有

我們都知道不是任何數字的平方的數字,如2、3、5、7、8等。非平方數有N個,不可能知道每個數字。因此,在本文中,我們將解釋有關無平方數或非平方數的所有內容,以及在C++中尋找第N個非平方數的方法。第N個非平方數如果一個數是整數的平方,則該數稱為完全平方數。完全平方數的一些例子是-1issquareof14issquareof29issquareof316issquareof425issquareof5如果一個數不是任何整數的平方,則該數稱為非平方數。例如,前15個非平方數是-2,3,5,6,

在PHP程式語言中,is_numeric()函數是一種非常常用的函數,用來判斷一個變數或值是否為數字。在實際程式設計中,常需要對使用者輸入的數值進行驗證,判斷其是否為數字類型,這時就可以使用is_numeric()函數來判斷。一、is_numeric()函數簡介is_numeric()函數是用來偵測變數或值是否為數字的函數。如果變數或值為數字,則傳回tru

在本文中,我們將討論查找1到n(給定)之間的數字的問題,這些數字不能被2到10之間的任何數字整除。讓我們透過一些例子來理解這一點-Input:num=14Output:3Explanation:Therearethreenumbers,1,11,and13,whicharenotdivisible.Input:num=21Output:5Explanation:Therearefivenumbers1,11,13,17,and19,whicharen的解題方法簡單方法如果
