অ্যান্ড্রয়েডে অ্যানাগ্রাম (Anagram) চেক করার অ্যাপ
দুই শব্দ বা বাক্য যখন একই অক্ষরগুলো দিয়ে গঠিত কিন্তু ক্রম ভিন্ন হয়, তখন সেগুলোকে অ্যানাগ্রাম (Anagram) বলা হয়। উদাহরণ: "listen" এবং "silent"। এই টিউটোরিয়ালে দুটি EditText-এ ইনপুট নিয়ে অ্যানাগ্রাম চেক করা দেখানো হলো।
লেআউট (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/edit_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="প্রথম শব্দ লিখুন"
android:inputType="text" />
<EditText
android:id="@+id/edit_query1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="দ্বিতীয় শব্দ লিখুন"
android:inputType="text"
android:layout_marginTop="16dp" />
<Button
android:id="@+id/buttonPanel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="চেক করুন"
android:layout_marginTop="24dp"
android:layout_gravity="center" />
</LinearLayout>
MainActivity.java - অ্যানাগ্রাম চেক লজিক
package com.example.myapplication;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
EditText editQuery, editQuery1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editQuery = findViewById(R.id.edit_query);
editQuery1 = findViewById(R.id.edit_query1);
findViewById(R.id.buttonPanel).setOnClickListener(v -> checkAnagram());
}
private void checkAnagram() {
String first = editQuery.getText().toString().trim().toLowerCase().replaceAll("\\s+", "");
String second = editQuery1.getText().toString().trim().toLowerCase().replaceAll("\\s+", "");
if (first.isEmpty() || second.isEmpty()) {
Toast.makeText(this, "দুই বক্সে মান দিন", Toast.LENGTH_SHORT).show();
return;
}
if (areAnagrams(first, second)) {
Toast.makeText(this, "✅ এটি একটি অ্যানাগ্রাম!", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "❌ এটি অ্যানাগ্রাম নয়", Toast.LENGTH_LONG).show();
}
}
// অপ্টিমাইজড অ্যানাগ্রাম চেক: ক্যারেক्टर কাউন্ট ব্যবহার করে O(n) টাইম কমপ্লেক্সিটি
private boolean areAnagrams(String s1, String s2) {
if (s1.length() != s2.length()) return false;
int[] charCount = new int[26]; // a-z এর জন্য
for (int i = 0; i < s1.length(); i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 >= 'a' && c1 <= 'z') charCount[c1 - 'a']++;
if (c2 >= 'a' && c2 <= 'z') charCount[c2 - 'a']--;
}
for (int count : charCount) {
if (count != 0) return false;
}
return true;
}
}
অ্যালগরিদম ব্যাখ্যা
- নিবিড় পদ্ধতি (O(n²)): প্রতিটি ক্যারেক্টারের জন্য দূরتی স্ট্রিংে সার্চ (মূল কোডে ছিল)
- সর্টিং পদ্ধতি (O(n log n)): দুটি স্ট্রিং সর্ট করে তুলনা
- ক্যারেক্টার কাউন্ট (O(n)) - সেরা: অ্যারে ব্যবহার করে প্রতিটি অক্ষরের ফ্রিকোয়েন্সি গুনে তুলনা
উন্নত সংস্করণ (Unicode সাপোর্ট সহ)
private boolean areAnagramsAdvanced(String s1, String s2) {
if (s1.length() != s2.length()) return false;
// HashMap ব্যবহার করে যেকোনো Unicode ক্যারেক্টার হ্যান্ডেল করুন
java.util.Map<Character, Integer> map = new java.util.HashMap<>();
for (char c : s1.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
for (char c : s2.toCharArray()) {
int count = map.getOrDefault(c, 0);
if (count == 0) return false;
map.put(c, count - 1);
}
return true;
}
