C++生成長度為n的Lyndon詞的程式


在這個問題中,我們需要使用給定的字元生成長度為n的Lyndon詞。Lyndon詞是指任何旋轉都嚴格大於其自身的詞(按字典序)。

以下是Lyndon詞的示例。

  • 01 − “01”的旋轉是“10”,它始終嚴格大於“01”。

  • 012 − “012”的旋轉是“120”和“210”,它們嚴格大於“012”。

問題陳述 − 我們給定一個包含數字字元的陣列s[]。此外,我們還給定n表示Lyndon詞的長度。我們需要使用陣列字元生成長度為n的Lyndon詞。

示例

輸入

S[] = {'0', '1', '2'}, n = 2

輸出

01, 02, 12

解釋 − 我們使用字元“0”、“1”和“2”生成了長度為2的Lyndon詞。

示例

輸入

S[] = {'0', '1'}, n = 3

輸出

001, 011

解釋 − “001”和“011”的所有旋轉在字典序上都大於其自身。

方法1

我們可以使用Duval演算法生成Lyndon詞。程式設計師可以按照以下演算法使用陣列的字元生成長度為n的Lyndon詞。

演算法

步驟1 − 使用sort()方法對字元陣列進行排序。

步驟2 − 定義“chars”向量來儲存陣列字元的索引。

步驟3 − 最初將“-1”推入“chars”列表,表示起始索引。

步驟4 − 使用while迴圈進行迭代,直到“chars”列表的大小大於零。

步驟5 − 將最後一個索引加1。

步驟6 − 將列表大小儲存在“chars_size”變數中。

步驟7 − 如果“chars_size”等於“len”,則我們找到了長度等於“len”的Lyndon詞。列印“chars”列表的所有字元。

步驟8 − 使用迴圈將字元追加到“chars”列表中,直到列表的長度小於“len”。我們可以從“chars”列表中獲取字元,並將其不斷追加到列表的末尾。

步驟9 − 如果“chars”列表的大小大於零,並且列表的最後一個字元等於陣列的最後一個字元,則將其從列表中刪除。

示例

讓我們除錯以下示例的樣本輸入以更好地理解。

  • 最初,“chars”列表將是[-1]。

  • 在第一次迭代中,“chars”列表將變為[0]。之後,列表的大小不等於“len”,因此我們繼續前進。在這裡,我們建立了一個大小為“len”的列表,更新後的列表將是[0, 0]。

  • 在接下來的迭代中,我們將最後一個元素加1,以便生成的列表將是[0, 1]。在此迭代中,我們有一個大小等於“len”的列表,並且我們可以使用第0個和第1個索引的字元來建立第一個長度為2的Lyndon詞“01”。

  • 在接下來的迭代中,我們增加列表的最後一個索引,它變為[0, 2]。我們再次找到一個新的Lyndon詞“02”。此外,在“chars”列表中,最後一個索引元素等於“array_len - 1”,因此將其刪除,更新後的列表為[0]。

  • 在接下來的迭代中,最後一個索引和更新後的列表將是[1]。將列表大小設定為2,更新後的列表將是[1, 1]。

  • 在接下來的迭代中,將最後一個元素加1;更新後的列表將是[1, 2]。在這裡,我們找到了第三個Lyndon詞“12”。

#include <bits/stdc++.h>
using namespace std;
void generateLydonWord(char characters[], int array_len, int len) {
    sort(characters, characters + array_len);
    // for storing the indexes
    vector<int> chars;
    // Initial index is -1
    chars.push_back(-1);
    // Make iterations till the size of chars is greater than 0
    while (chars.size() > 0) {
        // Increase last char by 1
        chars[chars.size() - 1]++;
        // store the size of the array
        int chars_size = chars.size();
        // If the size is equal to len, we found the Lyndon word
        if (chars_size == len) {
            // Print the word
            string temp;
            for (int p = 0; p < chars.size(); p++) {
                temp += characters[chars[p]];
            }
            cout << temp << endl;
        }
        // keep appending the chars characters until its length becomes equal to len
        while (chars.size() < len) {
            chars.push_back(chars[chars.size() - chars_size]);
        }
        while (chars.size() > 0 && chars[chars.size() - 1] == array_len - 1) {
            chars.pop_back();
        }
    }
}
int main() {
    int n = 2;
    char S[] = {'0', '1', '2'};
    int array_len = sizeof(S) / sizeof(S[0]);
    cout << "The Lyndon words of length 2 are :- \n ";
    generateLydonWord(S, array_len, n);
    return 0;
}

輸出

The Lyndon words of length 2 are :- 
 01
02
12

時間複雜度− O(N* logN),因為我們需要對陣列進行排序。

空間複雜度 − O(N),因為我們使用“chars”陣列來儲存元素的索引。

我們學習瞭如何使用Duval演算法查詢給定長度的Lyndon詞。此外,我們還除錯了樣本輸入以瞭解Duval演算法的工作原理。

更新於: 2023年8月14日

72 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告