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' (ইন্ডেক্স ৩-এ)

অলগরিদম কমপ্লেক্সিটি
- টাইম: 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 ব্যবহার করে ফ্রিকোয়েন্সি কাউন্ট এবং অর্ডার রক্ষা একসাথে করা যায়। এটি স্ট্রিং প্রসেসিং ইন্টারভিউ কোয়েশনের একটি ক্লাসিক সমাধান।