Python3程式:常數時間內查詢給定字串的旋轉和第K個字元


在這個問題中,我們需要根據給定的規則執行查詢,並列印更新後的字串中的字元。我們將使用兩種不同的方法來解決這個問題。第一種方法將使用字串旋轉的概念,第二種方法將使用索引定製的方法。

問題陳述 – 給我們的任務是對字串執行給定的查詢。我們得到一個查詢陣列,每個查詢包含兩個整數。

按照以下步驟對字串執行給定的查詢。

  • (1, l) – 需要將字串左旋轉l次。

  • (2, l) – 需要訪問第l個位置的字元。這裡,1 <= l <= n。

示例

輸入

queries = [[1, 3], [2, 3], [2, 4], [2, 2]], s = "vdflkmng"

輸出

m, n, k

解釋 – 讓我們執行陣列中給定的四個查詢。

  • 在第一個查詢中對字串進行3次左旋轉。最終字串將是’lkmngvdf’。

  • 列印第三個字元,即’m’。

  • 列印第四個字元,即’n’。

  • 列印第二個字元,即’k’。

輸入

queries = [[1, 3], [1, 2], [1, 3], [2, 2]], s = "welcome"

輸出

l

解釋

  • 第一個查詢後,字串將變為’comewel’。

  • 第二個查詢後,字串將變為’mewelco’。

  • 第三個查詢後,字串將變為’elcomew’。

  • 在最後一個查詢中,它列印第二個字元,即’l’。

方法1

在這種方法中,我們將給定的字串分成兩部分,然後再次連線起來以執行N次左旋轉。之後,我們在第二個查詢中訪問給定索引處的字元。

演算法

步驟1 – 第一步,我們需要迭代所有查詢的陣列。

步驟2 – 如果que[m][0] == 1,則對字串s進行總共que[m][1]次左旋轉,並將其儲存到s中。

步驟2.1 – 為了進行que[m][1]次左旋轉,我們可以從m索引處將字串分成兩部分,並將右部分和左部分連線起來。

步驟3 – 如果que[m][0] == 2,我們需要列印que[m][1]索引處的字元。

步驟4 – 從給定索引訪問字元,並在輸出中顯示。

示例

def executeQueries(s, str_len, que, que_len):
    # Traverse query
    for m in range(que_len):
        # String rotation
        if que[m][0] == 1:
            # Rotate the string by que[m][1] to the left
            s = s[que[m][1]:] + s[:que[m][1]]
        else:
            index = que[m][1] - 1
            # Show character
            print(s[index])
# Driver code
if __name__ == "__main__":
    s = "vdflkmng"
    length = len(s)
    queries = [[1, 3], [2, 3], [2, 4], [2, 2]]
    queries_length = len(queries)
    executeQueries(s, length, queries, queries_length)

輸出

m
n
k

時間複雜度 – O(M*N),因為我們將字串分成兩部分並遍歷列表。

空間複雜度 – O(N),因為我們儲存旋轉後的字串。

方法2

此方法是上述方法的最佳化版本。在這裡,我們定義一個指標指向最後一個索引。當我們執行查詢時,我們更新指標值,這有助於我們節省時間和空間。

演算法

步驟1 – 定義’ind_ptr’變數並初始化為零,表示索引指標。

步驟2 – 使用迴圈遍歷列表。

步驟3 – 如果que[m][0]等於1,我們需要操作索引指標的值。

步驟3.1 – 將que[m][1]新增到ind_ptr,取結果值對26取模,然後再次將其賦值給ind_ptr變數。

步驟4 – 如果que[m][0]等於2,我們需要列印位於que[m][1]索引處的字元。

步驟5 – 將que[m][1] – 1新增到ind_ptr變數,並對其取模26。之後,將結果值賦給index變數。

步驟6 – 從索引訪問字元,並將其列印到輸出中。

示例

def executeQueries(s, str_len, que, que_len):
    # Starting pointer
    ind_ptr = 0
    # Traverse query
    for m in range(que_len):
        # String rotation
        if que[m][0] == 1:
            # Change index pointer value
            ind_ptr = (ind_ptr + que[m][1]) % str_len
        else:
            index = que[m][1]
            # Get the rotational index of the character
            index = (ind_ptr + index - 1) % str_len
            # Show character
            print(s[index])
if __name__ == "__main__":
    s = "vdflkmng"
    length = len(s)
    queries = [[1, 3], [2, 3], [2, 4], [2, 2]]
    queries_length = len(queries)
    executeQueries(s, length, queries, queries_length)

輸出

m
n
k

時間複雜度 – O(M),因為我們遍歷給定的查詢列表。

空間複雜度 – O(1),因為我們使用常量空間。

我們根據給定的條件執行字串的左旋轉。程式設計師也可以嘗試執行包含右字串旋轉的查詢。

更新於:2023年8月25日

66 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告