কম্পিউটার টিউটোরিয়াল

পাইথন প্রোগ্রাম: স্ট্রিং রি-অ্যারেঞ্জ করা যাতে সব সেম ক্যারেক্টার d দূরত্বে থাকে

একটি নন-এম্পটি স্ট্রিং str এবং একটি ইন্টিজার k দেওয়া আছে, স্ট্রিংটি পুনর্বিন্যাস করুন যাতে একই ক্যারেক্টারগুলো একে অপরের থেকে কমপক্ষে দূরত্ব k থাকে।

সকল ইনপুট স্ট্রিং লোয়ারকেস লেটারে দেওয়া থাকে। যদি স্ট্রিংটি পুনর্বিন্যাস করা সম্ভব না হয়, তবে খালি স্ট্রিং "" রিটার্ন করুন।

উদাহরণ ১:

str = "tutorialspoint", k = 3 
Answer: "tiotiotalnprsu"

একই ক্যারেক্টারগুলো কমপক্ষে ৩ ক্যারেক্টার দূরত্বে রয়েছে।

str = "aabbcc", k = 3 
Answer: "abcabc" 
একই ক্যারেক্টারগুলো কমপক্ষে ৩ ক্যারেক্টার দূরত্বে রয়েছে।

উদাহরণ ২

str = "aaabc", k = 3 
Answer: "" 
স্ট্রিংটি পুনর্বিন্যাস করা সম্ভব নয়।

উদাহরণ ৩:

str = "aaadbbcc", k = 2 
Answer: "abacabcd" 
আরেকটি সম্ভাব্য উত্তর: "abcabcda" 
একই ক্যারেক্টারগুলো কমপক্ষে ২ ক্যারেক্টার দূরত্বে রয়েছে।

প্রোগ্রাম

MAX = 128 
# একটি ক্যারেক্টার 'char' এবং এর ফ্রিকোয়েন্সি 'freq' সংরক্ষণের জন্য স্ট্রাকচার 
# ইনপুট স্ট্রিং-এ 
class charFreq(object): 
    def __init__(self, char, freq): 
        self.c = char 
        self.f = freq 

# দুটি charFreq আইটেম স왪 করার ইউটিলিটি ফাংশন 
def swap(x, y): 
    return y, x 

# স্ট্রিংকে লিস্টে কনভার্ট করার ইউটিলিটি ফাংশন 
def toList(string): 
    t = [] 
    for x in string: 
        t.append(x) 
    return t 

# লিস্টকে স্ট্রিংে কনভার্ট করার ইউটিলিটি ফাংশন 
def toString(l): 
    return ''.join(l) 

# freq[]-এ সংরক্ষিত হিপের নোড freq[i]-কে ম্যাক্সহিপিফাই করার ইউটিলিটি ফাংশন 
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) 

# freq[] অ্যারেকে ম্যাক্স হিপে কনভার্ট করার ইউটিলিটি ফাংশন 
def buildHeap(freq, n): 
    i = (n - 1) // 2 
    while i >= 0: 
        maxHeapify(freq, i, n) 
        i -= 1 

# ম্যাক্স হিপ থেকে ম্যাক্স আইটেম বা রুট রিমুভ করার ইউটিলিটি ফাংশন 
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 

# মূল ফাংশন যা ইনপুট স্ট্রিং 'str'-কে পুনর্বিন্যাস করে যাতে 
# দুই সেম ক্যারেক্টার d দূরত্বে চলে যায় 
def rearrange(string, d): 
    # ইনপুট স্ট্রিংর দৈর্ঘ্য বের করুন 
    n = len(string) 
    # স্ট্রিং-এ সব ক্যারেক্টার ও তাদের ফ্রিকোয়েন্সি সংরক্ষণের জন্য অ্যারে 
    freq = [] 
    for x in range(MAX): 
        freq.append(charFreq(0, 0)) 
    m = 0 
    # ইনপুট স্ট্রিং ট্রাভার্স করে সব ক্যারেক্টারের ফ্রিকোয়েন্সি freq[]-এ স্টোর করুন 
    for i in range(n): 
        x = ord(string[i]) 
        # যদি এই ক্যারেক্টার প্রথমবার আসে, m ইনক্রিমেন্ট করুন 
        if freq[x].c == 0: 
            freq[x].c = chr(x) 
            m += 1 
        freq[x].f += 1 
        string[i] = '\0' 
    # সব ক্যারেক্টারের ম্যাক্স হিপ বানান 
    buildHeap(freq, MAX) 
    # এখন এক-এক করে ম্যাক্স হিপ থেকে সব ডISTINCT ক্যারেক্টার এক্সট্রাক্ট করুন 
    # এবং স্ট্রিং-এ d দূরত্ব কনস্ট্রেইন্ট সহ ফিরিয়ে দিন 
    for i in range(m): 
        x = extractMax(freq, MAX - i) 
        # স্ট্রিং-এ প্রথম উপলব্ধ পজিশন খুঁজুন 
        p = i 
        while string[p] != '\0': 
            p += 1 
        # x.c কে p, p+d, p+2d, .. p+(f-1)d পজিশনে ফিল করুন 
        for k in range(x.f): 
            # যদি ইনডেক্স সাইজের বাইরে চলে যায়, তবে স্ট্রিং পুনর্বিন্যাস করা যাবে না 
            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))

রেজাল্ট

tiotiotalnprsu
  1. দেওয়া স্ট্রিংয়ের সকল পারমিউটেশন প্রিন্ট করার পাইথন প্রোগ্রাম

  2. পাইথনে দুটি স্ট্রিং থেকে অনন্য ক্যারেক্টার নিয়ে নতুন স্ট্রিং তৈরি

  3. পাইথনে স্ট্রিং-এ সব ক্যারেক्टर ইউনিক কিনা চেক করা

  4. পাইথনে ক্যারেক্টারের লিস্টকে স্ট্রিংয়ে রূপান্তর করার প্রোগ্রাম