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

Android-এ স্ট্রিংয়ের প্রথম নন-রিপিটিং ক্যারেক্টার বের করার পদ্ধতি

Android-এ দেওয়া স্ট্রিংয়ের প্রথম নন-রিপিটিং (Non-Repeating) ক্যারেক্টার খুঁজে বের করা

এই টিউটোরিয়ালে আমরা দেখব কিভাবে LinkedHashMap ব্যবহার করে একটি স্ট্রিংয়ের ক্যারেক্টার ফ্রিকোয়েন্সি কাউন্ট করা যায় এবং ইনসারশন অর্ডার রক্ষা করে প্রথম নন-রিপিটিং ক্যারেক্টার বের করা যায়।

প্রয়োজনীয় ধাপসমূহ

ধাপ ১: নতুন প্রজেক্ট তৈরি করুন

Android Studio → File → New Project → প্রয়োজনীয় ডিটেইলস পূরণ করুন।

ধাপ ২: লেআউট ফাইল (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="30sp"
        android:gravity="center" />

</LinearLayout>

ধাপ ৩: MainActivity.java (বাগ-ফিক্সড সংস্করণ)

package com.example.myapplication;

import android.os.Build;
import android.os.Bundle;
import android.widget.TextView;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import java.util.*;

public class MainActivity extends AppCompatActivity {

    @RequiresApi(api = Build.VERSION_CODES.P)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String input = "tutorialspoint";

        // LinkedHashMap: ইনসারশন অর্ডার রক্ষা করে + ফ্রিকোয়েন্সি স্টোর করে
        LinkedHashMap<Character, Integer> freqMap = new LinkedHashMap<>();

        for (char c : input.toCharArray()) {
            freqMap.put(c, freqMap.getOrDefault(c, 0) + 1);
        }

        // প্রথম ক্যারেক্টার যেটার ফ্রিকোয়েন্সি ১
        Character firstNonRepeating = null;
        for (Map.Entry<Character, Integer> entry : freqMap.entrySet()) {
            if (entry.getValue() == 1) {
                firstNonRepeating = entry.getKey();
                break;
            }
        }

        TextView textView = findViewById(R.id.text);
        if (firstNonRepeating != null) {
            textView.setText("প্রথম নন-রিপিটিং ক্যারেক্টার: '" + firstNonRepeating + "'");
        } else {
            textView.setText("কোনো নন-রিপিটিং ক্যারেক্টার নেই");
        }
    }
}

মূল কোডের সমস্যা ও সমাধান:

  • মূল কোডে hashMap.put(strArray.charAt(i), chars[i] + 1) ভুল ছিল — ক্যারেক্টার কে ইন্টে কনভার্ট করছিল।
  • এখানে getOrDefault(c, 0) + 1 ব্যবহার করে সঠিক ফ্রিকোয়েন্সি কাউন্ট করা হয়েছে।
  • LinkedHashMap ইনসারশন অর্ডার রক্ষা করে, তাই প্রথম নন-রিপিটিং ক্যারেক্টার সহজে বের হয়।

ফলাফল

ইনপুট: "tutorialspoint"

ফ্রিকোয়েন্সি: t=2, u=2, o=2, r=1, i=2, a=1, l=1, s=1, p=1, n=1

প্রথম নন-রিপিটিং (ইনসারশন অর্ডার অনুযায়ী): 'r' (ইন্ডেক্স ৩-এ)

Android-এ স্ট্রিংয়ের প্রথম নন-রিপিটিং ক্যারেক্টার বের করার পদ্ধতি

অলগরিদম কমপ্লেক্সিটি

  • টাইম: O(n) — একবার ট্রাভার্সাল কাউন্টের জন্য, একবার ম্যাপ ইটারেশনের জন্য।
  • স্পেস: O(k) — k = অনIQUE ক্যারেক্টার সংখ্যা (সর্বোচ্চ ২৫৬ ASCII-র জন্য)।

বিকল্প পদ্ধতি (Array ব্যবহার করে - O(1) স্পেস যদি ASCII)

int[] count = new int[256];
for (char c : input.toCharArray()) count[c]++;
for (char c : input.toCharArray()) if (count[c] == 1) return c;

সারসংক্ষেপ

LinkedHashMap ব্যবহার করে ফ্রিকোয়েন্সি কাউন্ট এবং অর্ডার রক্ষা একসাথে করা যায়। এটি স্ট্রিং প্রসেসিং ইন্টারভিউ কোয়েশনের একটি ক্লাসিক সমাধান।

  1. Android-এ অ্যারেতে মাঝপথের এলিমেন্ট বের করার পদ্ধতি

  2. Android-এ সেকেন্ড মোস্ট রিপিটেড স্ট্রিং বের করার পদ্ধতি

  3. Android-এ স্ট্রিং অ্যারে থেকে কমন ক্যারেক্টার সরানোর পদ্ধতি

  4. অ্যান্ড্রয়েডে ছবিকে Base64 স্ট্রিং-এ রূপান্তর করার পদ্ধতি