Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình Python để Sắp xếp lại một chuỗi sao cho tất cả các ký tự giống nhau cách xa nhau

Cho một chuỗi không rỗng str và một số nguyên k, hãy sắp xếp lại chuỗi sao cho các ký tự giống nhau cách nhau ít nhất k.

Tất cả các chuỗi đầu vào được viết bằng chữ thường. Nếu không thể sắp xếp lại chuỗi, hãy trả về một chuỗi trống "".

Ví dụ 1:

str = “tutorialspoint”, k = 3

Answer: “tiotiotalnprsu”

Các ký tự giống nhau cách nhau ít nhất 3 ký tự.

str = "aabbcc", k = 3

Answer: "abcabc"

The same characters are at least 3 character distance apart.

Ví dụ 2

str = "aaabc", k = 3

Answer: ""

It is not possible to rearrange the string.

Ví dụ 3:

str = "aaadbbcc", k = 2

Answer: "abacabcd"

Another possible answer is: "abcabcda"

The same characters are at least 2 character distance apart.

Ví dụ

MAX = 128

# A structure to store a character 'char' and its frequency 'freq'
# in input string
class charFreq(object):
   def __init__(self,char,freq):
      self.c = char
      self.f = freq

# A utility function to swap two charFreq items.
def swap(x, y):
   return y, x

# A utility function
def toList(string):
   t = []
   for x in string:
      t.append(x)

   return t

# A utility function
def toString(l):
   return ''.join(l)

# A utility function to maxheapify the node freq[i] of a heap stored in freq[]
def maxHeapify(freq, i, heap_size):
   l = i*2 + 1
   r = i*2 + 2
   largest = i
   if l < heap_size and freq[l].f > freq[i].f:
      largest = l
   if r < heap_size and freq[r].f > freq[largest].f:
      largest = r
   if largest != i:
      freq[i], freq[largest] = swap(freq[i], freq[largest])
      maxHeapify(freq, largest, heap_size)

# A utility function to convert the array freq[] to a max heap
def buildHeap(freq, n):
   i = (n - 1)//2
   while i >= 0:
      maxHeapify(freq, i, n)
      i-=1

# A utility function to remove the max item or root from max heap
def extractMax(freq, heap_size):
   root = freq[0]
   if heap_size > 1:
      freq[0] = freq[heap_size-1]
      maxHeapify(freq, 0, heap_size-1)

return root

# The main function that rearranges input string 'str' such that
# two same characters become d distance away
def rearrange(string, d):
   # Find length of input string
   n = len(string)

   # Create an array to store all characters and their
   # frequencies in str[]
   freq = []
   for x in range(MAX):
      freq.append(charFreq(0,0))

   m = 0

   # Traverse the input string and store frequencies of all
   # characters in freq[] array.
   for i in range(n):
      x = ord(string[i])

      # If this character has occurred first time, increment m
      if freq[x].c == 0:
         freq[x].c = chr(x)
         m+=1

      freq[x].f+=1
      string[i] = '\0'

   # Build a max heap of all characters
   buildHeap(freq, MAX)

   # Now one by one extract all distinct characters from max heap
   # and put them back in str[] with the d distance constraint
   for i in range(m):
      x = extractMax(freq, MAX-i)

      # Find the first available position in str[]
      p = i
      while string[p] != '\0':
         p+=1

      # Fill x.c at p, p+d, p+2d, .. p+(f-1)d
      for k in range(x.f):

         # If the index goes beyond size, then string cannot
         # be rearranged.
         if p + d*k >= n:
            print ("It is not possible to rearrange the string.")
         return

      string[p + d*k] = x.c

   return toString(string)

string = "tutorialspoint"
print (rearrange(toList(string), 3) )

Kết quả

tiotiotalnprsu