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

জাভা প্রোগ্রাম: রিকার্শন ব্যবহার করে সেন্টেন্স (Sentence) রিভার্স করা

স্ট্রিং রিভার্স রিকার্শনে

একটি স্ট্রিং বা সেন্টেন্স রিভার্স করার জন্য রিকার্শন ব্যবহার করা যায়। প্রতিটি কল থেকে প্রথম ক্যারেক্টার (charAt(0)) নেয়া হয় এবং বাকি স্ট্রিং (substring(1)) রিকার্সিভলি প্রসেস করা হয়।

ইনপুট ও আউটপুট উদাহরণ

ইনপুট:

Enter the sentence : Have a nice evening

আউটপুট:

The reversed input is: gnineve ecin a evaH

অ্যালগরিদম

  1. প্রোগ্রাম শুরু করুন
  2. দুটি স্ট্রিং ভেরিয়েবল ঘোষণা করুন: my_input, my_result
  3. ব্যবহারকারী থেকে সেন্টেন্স ইনপুট নিন (nextLine() ব্যবহার করুন)
  4. রিকার্সিভ ফাংশন reverseString(str) ডিফাইন করুন:
    • বেস কেস: যদি str.isEmpty() হয়, str রিটার্ন করুন
    • রিকার্সিভ কেস: reverseString(str.substring(1)) + str.charAt(0) রিটার্ন করুন
  5. ফাংশন কল করুন এবং ফলাফল স্টোর করুন
  6. ফলাফল প্রদর্শন করুন
  7. প্রোগ্রাম শেষ করুন

উদাহরণ ১: ব্যবহারকারী ইনপুট নেওয়া

import java.util.Scanner;

public class Reverse {
    public static void main(String[] args) {
        String my_input, my_result;
        System.out.println("Required packages have been imported");
        Scanner my_scanner = new Scanner(System.in);
        System.out.println("A reader object has been defined");
        System.out.print("Enter the sentence : ");
        my_input = my_scanner.nextLine();
        
        my_result = reverseString(my_input);
        System.out.println("The reversed input is: " + my_result);
    }
    
    public static String reverseString(String my_input) {
        if (my_input.isEmpty())
            return my_input;
        return reverseString(my_input.substring(1)) + my_input.charAt(0);
    }
}

উদাহরণ ২: পূর্বনির্ধারিত মান ব্যবহার

public class Reverse {
    public static void main(String[] args) {
        String my_input = "Have a nice evening";
        System.out.println("The string is defined as :" + my_input);
        String my_result = reverseString(my_input);
        System.out.println("The reversed input is: " + my_result);
    }
    
    public static String reverseString(String my_input) {
        if (my_input.isEmpty())
            return my_input;
        return reverseString(my_input.substring(1)) + my_input.charAt(0);
    }
}

রিকার্শন ট্রেস ("abc")

reverseString("abc")
= reverseString("bc") + 'a'
= (reverseString("c") + 'b') + 'a'
= ((reverseString("") + 'c') + 'b') + 'a'
= (("" + 'c') + 'b') + 'a'
= "cba"

কোড ব্যাখ্যা

  • substring(1): প্রথম ক্যারেক্টার বাদে বাকি স্ট্রিং রিটার্ন করে
  • charAt(0): প্রথম ক্যারেক্টার রিটার্ন করে
  • কনক্যাটেনেশন (+): রিকার্সিভ কলের রেজাল্টের সাথে প্রথম ক্যারেক्टर যোগ করা
  • ইমিউটেবিলিটি: স্ট্রিং ইমিউটেবল, প্রতিটি কনক্যাটেনেশনে নতুন অবজেক্ট তৈরি হয়

পারফরম্যান্স সমস্যা ও সমাধান

সমস্যা: স্ট্রিং কনক্যাটেনেশন (+) O(n²) টাইম কমপ্লেক্সিটি তৈরি করে কারণ প্রতিবার নতুন স্ট্রিং অবজেক্ট বানয়।

সমাধান ১: StringBuilder ব্যবহার (রিকার্শনে)

public static String reverseStringBuilder(String str) {
    StringBuilder sb = new StringBuilder();
    reverseHelper(str, 0, sb);
    return sb.toString();
}

private static void reverseHelper(String str, int index, StringBuilder sb) {
    if (index == str.length()) return;
    reverseHelper(str, index + 1, sb);
    sb.append(str.charAt(index));
}

সমাধান ২: চার অ্যারে (সবচেয়ে দ্রুত)

public static String reverseCharArray(String str) {
    char[] chars = str.toCharArray();
    int left = 0, right = chars.length - 1;
    while (left < right) {
        char temp = chars[left];
        chars[left] = chars[right];
        chars[right] = temp;
        left++;
        right--;
    }
    return new String(chars);
}

সমাধান ৩: Java বিল্ট-ইন (সর্বোত্তম)

public static String reverseBuiltIn(String str) {
    return new StringBuilder(str).reverse().toString();
}

// Java 11+
public static String reverseJava11(String str) {
    return new String(str.chars()
        .mapToObj(c -> (char) c)
        .collect(java.util.stream.Collectors.collectingAndThen(
            java.util.stream.Collectors.toList(),
            list -> { java.util.Collections.reverse(list); return list; }
        ))
        .stream()
        .map(String::valueOf)
        .collect(java.util.stream.Collectors.joining()));
}

তুলনা

পদ্ধতিসময় জটিলতাস্পেস জটিলতানোট
সিম্পল রিকার্শন (+)O(n²)O(n²)শেখার জন্য, প্রোডাকশনে নয়
StringBuilder রিকার্শনO(n)O(n)উন্নত রিকার্শন
চার অ্যারে স্ব্যাপO(n)O(n)স্পেস-ইফিশিয়েন্ট
StringBuilder.reverse()O(n)O(n)প্রোডাকশনের জন্য সেরা

শব্দের ক্রম রিভার্স (Word-level Reverse)

public static String reverseWords(String sentence) {
    String[] words = sentence.split("\\s+");
    StringBuilder result = new StringBuilder();
    for (int i = words.length - 1; i >= 0; i--) {
        result.append(words[i]);
        if (i > 0) result.append(" ");
    }
    return result.toString();
}
// "Have a nice evening" → "evening nice a Have"

Unicode সাপোর্ট (Emoji, বাংলা)

// কোড পয়েন্ট ব্যবহার করুন (সারোগেট পেয়ার হ্যান্ডলিং)
public static String reverseUnicode(String str) {
    int[] codePoints = str.codePoints().toArray();
    StringBuilder sb = new StringBuilder();
    for (int i = codePoints.length - 1; i >= 0; i--) {
        sb.appendCodePoint(codePoints[i]);
    }
    return sb.toString();
}
  1. জাভা প্রোগ্রাম: ডেসিমাল থেকে অক্টালে রূপান্তর

  2. পাইথন প্রোগ্রাম: রিকার্শন ব্যবহার করে স্ট্যাক রিভার্স করা

  3. পাইথন প্রোগ্রাম: রিকার্শন ছাড়া স্ট্রিং রিভার্স করা

  4. পাইথন প্রোগ্রাম: রিকার্শন ব্যবহার করে স্ট্রিং রিভার্স করা