在 Python 中查詢給定字串中具有 k 個唯一字元的最長子字串


假設我們有一個字串,我們必須返回具有恰好 k 個唯一字元的最長可能的子字串,如果有多個最長可能長度的子字串,則返回其中任何一個。

因此,如果輸入類似於 s = "ppqprqtqtqt",k = 3,則輸出將為 rqtqtqt,因為它的長度為 7。

為了解決這個問題,我們將遵循以下步驟:

  • N := 26

  • 定義一個函式 is_ok()。這將接收 count 和 k 作為引數。

  • val := 0

  • 對於 i 從 0 到 N,執行以下操作:

    • 如果 count[i] > 0,則

      • val := val + 1

  • 當 (k >= val) 時返回 true

  • 從主方法中,執行以下操作:

  • unique := 0,size := s 的大小

  • count := 一個大小為 N 的陣列,用 0 填充

  • 對於 i 從 0 到 size,執行以下操作:

    • 如果 s[i] 的計數為 0,則

      • unique := unique + 1

    • 將 s[i] 的計數增加 1

  • 如果 unique < k,則

    • 沒有這樣的字元,退出

  • start := 0,end := 0

  • window_length := 1,window_start := 0

  • count := 一個大小為 N 的陣列,用 0 填充

  • 將 s[0] 的計數增加 1

  • 對於 i 從 1 到 size,執行以下操作:

    • 將 s[i] 的計數增加 1

    • end := end + 1

    • 當 is_ok(count, k) 為假時,執行以下操作:

      • 將 s[i] 的計數減少 1

      • start := start + 1

    • 如果 end-start+1 > window_length,則

      • window_length := end-start+1

      • window_start := start

  • 返回 s 的子字串(從索引 window_start 到 window_start + window_length)

示例

讓我們看看以下實現以獲得更好的理解:

線上演示

N = 26
def is_ok(count, k):
   val = 0
   for i in range(N):
      if count[i] > 0:
         val += 1
   return (k >= val)
def k_unique_chars(s, k):
   unique = 0
   size = len(s)
   count = [0] * N
   for i in range(size):
      if count[ord(s[i])-ord('a')] == 0:
         unique += 1
      count[ord(s[i])-ord('a')] += 1
   if unique < k:
      return "Not sufficient characters"
   start = 0
   end = 0
   window_length = 1
   window_start = 0
   count = [0] * len(count)
   count[ord(s[0])-ord('a')] += 1
   for i in range(1,size):
      count[ord(s[i])-ord('a')] += 1
      end+=1
      while not is_ok(count, k):
         count[ord(s[start])-ord('a')] -= 1
         start += 1
      if end-start+1 > window_length:
         window_length = end-start+1
         window_start = start
   return s[window_start:window_start + window_length]

s = "ppqprqtqtqt"
k = 3
print(k_unique_chars(s, k))

輸入

"ppqprqtqtqt", 3

輸出

rqtqtqt

更新於: 2020年8月20日

547 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告