檢查給定字串的任何排列是否按字典順序大於另一個給定字串
我們已經給定了兩個字串,需要檢查給定字串的排列是否存在,以便一個排列可以比第i 個索引處的另一個排列具有更大的字元。
我們可以透過對字串進行排序,並逐一比較字串中的每個字元來解決問題。另外,我們可以利用兩個字串的字元頻率來解決問題。
問題陳述 - 我們給了長度為N的字串str1和str2。我們需要檢查是否存在任何字串的排列,使得其中一個字串的排列在字典序上大於另一個字串。這意味著任何排列都應該在第i個索引處具有比另一個字串排列的第i個索引字元更大的字元。
範例
輸入 - str1 = "aef"; str2 = "fgh";
輸出– 是
解釋– ‘fgh’ 已大於 ‘aef’。在這裡,a > f, g > e, h > f。
輸入– str1 = "adsm"; str2 = "obpc";
輸出– 否
Explanation– 我們找不到任何一種排列,使得其中一個字串的每個字元都大於另一個排列。
方法 1
在這個方法中,我們將按字典順序對兩個字串進行排序。然後,我們將比較字串的每個字元。如果str1的所有字元都小於str2,或str2的所有字元都小於str1,則傳回true。否則,返回false。
演算法
使用 sort() 方法對字串進行排序。
定義 isStr1Greater 布林變數並使用 true 進行初始化。
遍歷字串,且如果str1中第i個索引位置的字元小於str2,則將isStr1Greater的值更新為false,並使用break關鍵字中斷迴圈
如果 isStr1Greater 為真,則循環成功完成並傳回真。
現在,遍歷字串以檢查 str2 是否大於 str1。如果我們發現 str1 的任何字元都大於 str2,則傳回 false。
如果循環成功完成,則傳回true。
範例
#include <algorithm> #include <iostream> #include <string> using namespace std; bool isAnyPermLarge(string string1, string string2) { // sort the strings sort(string1.begin(), string1.end()); sort(string2.begin(), string2.end()); // to keep track if string1 is greater than string2 bool isStr1Greater = true; // traverse the string for (int i = 0; i < string1.length(); i++) { // if any character of string1 is less than string2, return false. if (string1[i] < string2[i]) { isStr1Greater = false; break; } } // If string1 is greater, returning true if (isStr1Greater) return true; // traverse the string for (int i = 0; i < string2.length(); i++) { // if any character of string2 is less than string1, return false. if (string1[i] > string2[i]) { return false; } } // return true if string2 is greater than string1 return true; } int main() { string string1 = "aef"; string string2 = "fgh"; bool res = isAnyPermLarge(string1, string2); if (res) { cout << "Yes, permutation exists such that one string is greater than the other."; } else { cout << "No, permutation does not exist such that one string is greater than the other."; } return 0; }
輸出
Yes, permutation exists such that one string is greater than the other.
時間複雜度 - O(N*logN),因為我們對字串進行排序。
空間複雜度 - O(N) 是用來對字串進行排序所需的。
方法2
在這種方法中,我們將儲存兩個字串中每個字元的總頻率。之後,我們將使用累積頻率來決定是否可以找到任何字串排列,使得其中一個大於另一個。
演算法
定義長度為26的map1和map2數組,並初始化為零。
將str1中字元的頻率儲存到map1中,將str2中字元的頻率儲存到map2中。
定義isStr1和isStr2布林變量,並初始化為false,以追蹤str1是否大於str2。
定義cnt1和cnt2變數來儲存字串字元的累積頻率。
遍歷map1和map2。將map1[i]加入cnt1,將map2[i]加入cnt2。
如果 cnt1 大於 cnt2,則 str1 到第 i 個索引處的字元的累積頻率較大。如果是這樣,並且 str2 已經更大,則傳回 false。否則,將 isStr1 改為 true
如果 cnt2 大於 cnt1,則 str2 中第 i 個索引處字元的累積頻率較大。如果是這樣,並且 str1 已經更大,則傳回 false。否則,將 isStr2 改為 true
最後回傳true。
範例
#include <iostream> #include <string> using namespace std; bool isAnyPermLarge(string string1, string string2) { int map1[26] = {0}; int map2[26] = {0}; // store the frequency of each character in the map1 for (int i = 0; i < string1.length(); i++) { map1[string1[i] - 'a']++; } // store the frequency of each character in the map2 for (int i = 0; i < string2.length(); i++) { map2[string2[i] - 'a']++; } // To keep track of which string is smaller. Initially, both strings are equal. bool isStr1 = false, isStr2 = false; // to count the cumulative frequency of characters of both strings int cnt1 = 0, cnt2 = 0; // traverse for all characters. for (int i = 0; i < 26; i++) { // update the cumulative frequency of characters cnt1 += map1[i]; cnt2 += map2[i]; if (cnt1 > cnt2) { // If string2 is already greater and cumulative frequency of string1 is greater than string2, then return false if (isStr2) return false; // update isStr1 to true as string1 is smaller isStr1 = true; } if (cnt1 < cnt2) { // If string1 is already greater and cumulative frequency of string2 is greater than string1, then return false if (isStr1) return false; // update isStr2 to true as string2 is smaller isStr2 = true; } } return true; } int main() { string string1 = "aef"; string string2 = "fgh"; bool res = isAnyPermLarge(string1, string2); if (res) { cout << "Yes, permutation exists such that one string is greater than the other."; } else { cout << "No, permutation does not exist such that one string is greater than the other."; } return 0; }
輸出
Yes, permutation exists such that one string is greater than the other.
時間複雜度 - O(N),因為我們計算字元的頻率。
空間複雜度 - O(26),因為我們在陣列中儲存字元的頻率。
我們學會了檢查兩個字串是否存在任何排列,使得一個字串的所有字元都可以大於另一個字串。第一種方法採用排序方法,第二種方法採用字元累積頻率。
以上是檢查給定字串的任何排列是否按字典順序大於另一個給定字串的詳細內容。更多資訊請關注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)

熱門話題

現今手機的效能和功能越來越強大,幾乎所有手機都配備了便利的NFC功能,方便用戶進行行動支付和身分認證。然而,有些小米14Pro的用戶可能不清楚如何啟用NFC功能。接下來,讓我詳細向大家介紹一下。小米14Pro怎麼開啟nfc功能?步驟一:打開手機的設定選單。步驟二:找到並點選「連接和分享」或「無線和網路」選項。步驟三:在連接和共享或無線和網路選單中,找到並點擊「NFC和付款」。步驟四:找到並點選「NFC開關」。一般情況下,預設是關閉的狀態。步驟五:在NFC開關頁面上,點選開關按鈕,將其切換為開啟狀

隔空滑動螢幕是華為的一項功能,在華為mate60系列中可以說是備受好評,這個功能是通過利用手機上的激光感應器和前置攝像頭的3D深感攝像頭,來完成一系列不需要觸碰螢幕的功能,比如說隔空刷抖音,但華為Pocket2該要怎麼隔空刷抖音呢?華為Pocket2怎麼隔空截圖? 1.開啟華為Pocket2的設定2、然後選擇【輔助功能】。 3.點選打開【智慧感知】。 4.打開【隔空滑動螢幕】、【隔空截圖】、【隔空按壓】開關就可以了。 5.使用的時候,需要再距離螢幕20~40CM處,張開手掌,待螢幕上出現手掌圖標,

iPhone16Pro的CAD檔案已經曝光,設計與先前的傳聞一致。去年秋天,iPhone15Pro新增了Action按鈕,而今年秋天,Apple似乎計劃對這款硬體的尺寸進行微小的調整。加入Capture按鈕據傳言,iPhone16Pro可能會新增第二個新按鈕,這將是繼去年之後連續第二年增加新按鈕。傳聞指出新的Capture按鈕將被設定在iPhone16Pro的右下側,這項設計可望讓相機控制更加便捷,同時也能讓Action按鈕用於其他功能。這個按鈕將不再只是一個普通的快門按鈕。關於相機,從目前iP

WPS是我們常用的辦公室軟體,在進行長篇文章的編輯時,常常會因為字體太小而看不清楚,所以會對字體和整個文件進行調整。例如:把文件進行行距的調整,會讓整個文件變得非常清晰,我建議各位小夥伴們都要學會這個操作步驟,今天就分享給大家,具體的操作步驟如下,快來看一看!開啟要調整的WPS文字文件,在【開始】選單中找到段落設定工具欄,你會看到行距設定小圖示(如圖中紅色線圈所示)。 2.點選行距設定右下角的小倒三角形,會出現對應的行距數值,可以選擇1~3倍行距(如圖箭頭所示)。 3.或者點選滑鼠右鍵點擊段落,就會出

microsoftteams中有很多語言可以選擇,那要怎麼切換語言呢?用戶需要點擊選單,然後找到設置,在裡面選擇通用,然後點擊語言,選擇語言後保存就可以了,這篇切換語言方法介紹就能夠告訴大家具體的內容,下面就是詳細的介紹,趕緊看看吧! microsoftteams怎麼切換語言答案:在設定-通用-語言中選擇具體過程:1、先點選頭像邊上的三個點進入設定。 2.之後點選裡面的通用選項。 3.之後點選語言,在裡面下拉可以看到更多語言。 4.最後點選儲存和重啟就可以了。

紅米RedmiK70E無疑是非常出色的,作為一款價格剛剛達到兩千元的手機,紅米RedmiK70E可以說是同檔位性價比最高的手機之一了。許多追求性價比的用戶都購買了這款手機,體驗紅米RedmiK70E上的各種功能。那麼紅米RedmiK70E如何設定自訂來電鈴聲呢?紅米RedmiK70E怎麼設定自訂來電鈴聲?要設定紅米RedmiK70E的自訂來電鈴聲,可以按照以下步驟操作:開啟手機的設定應用,在設定應用程式中找到「聲音與震動」或「聲音」選項,點選其中的「來電鈴聲」或「電話鈴聲”選項。在來電鈴聲設定

根據3月2日數據統計,比特幣二層網路MerlinChain總TVL已達30億美元。其中比特幣生態資產佔比達90.83%,包括價值15.96億美元的BTC以及4.04億美元的BRC-20資產等。上一個月,MerlinChain在開啟質押活動14天內,其TVL總額就已經達到了19.7億美元,超過了去年11月份上線也是最近同樣引人注目的Blast。 2月26日,MerlinChain生態內的NFT總價值超過了4.2億美元,成為除以太坊以外NFT市值最高的公鏈項目。項目簡介MerlinChain是OKX支

PHP7.2和5版本對比及優劣勢分析PHP是一種極為流行的伺服器端腳本語言,廣泛應用於Web開發。然而,PHP不斷在不同的版本中進行更新和改進,以滿足不斷變化的需求。目前,PHP7.2是最新版本,它和之前的PHP5版本相比有許多值得關注的差異和改進。在本文中,我們將對PHP7.2和PHP5版本進行對比,分析它們的優劣勢,並提供具體的程式碼範例。一、性能PH
