Python程式:查詢使字串排序所需的最小操作次數
假設我們有一個字串s。我們必須對s執行以下操作,直到得到一個排序的字串:
選擇最大的索引i,使得1 <= i < s的長度,並且s[i] < s[i - 1]。
選擇最大的索引j,使得i <= j < s的長度,並且對於範圍[i, j](包括i和j)內的所有可能的k值,都有s[k] < s[i - 1]。
交換索引i - 1和j處的兩個字元。
反轉從索引i開始的字尾。
我們必須找到使字串排序所需的操作次數。答案可能非常大,因此返回結果模10^9 + 7。
因此,如果輸入類似於s = "ppqpp",則輸出將為2,因為
在第一次操作中,i=3,j=4。交換s[2]和s[4]以獲得s="ppppq",然後反轉從索引3開始的子字串。現在,s="pppqp"。
在第二次操作中,i=4,j=4。交換s[3]和s[4]以獲得s="ppppq",然後反轉從索引4開始的子字串。現在,s = "ppppq"。
為了解決這個問題,我們將遵循以下步驟:
d := 一個大小為26的陣列,並用0填充
a := 0,t := 1
m := 10^9 + 7
n := 'a'的ASCII碼
對於s中每個索引i和字元c的反向順序,從索引1開始,執行以下操作:
j := c的ASCII碼 - n
d[j] := d[j] + 1
a :=(a + d[從索引0到j-1]的所有元素的總和) * (t/d[j]的商) mod m
t := t * (i/d[j]的商)
返回a
示例
讓我們看看以下實現以獲得更好的理解
def solve(s): d = [0]*26 a = 0 t = 1 m = 10**9 + 7 n = ord('a') for i,c in enumerate(s[::-1],1): j = ord(c) - n d[j] += 1 a = (a+sum(d[:j])*t//d[j]) % m t = t*i//d[j] return a s = "ppqpp" print(solve(s))
輸入
"ppqpp"
輸出
2
廣告