Anagram là gì?
Anagram (chữ đảo) là từ/hành ngữ tạo ra bằng cách sắp xếp lại các chữ cái của từ/hành ngữ khác, dùng đúng số lượng từng chữ cái. Ví dụ: "listen" ↔ "silent", "triangle" ↔ "integral".
Triển khai kiểm tra Anagram trên Android
Bước 1: Tạo dự án
Android Studio → New Project → Empty Activity.
Bước 2: Layout (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"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/edit_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Nhập chuỗi 1"
android:inputType="text" />
<EditText
android:id="@+id/edit_query1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:hint="Nhập chuỗi 2"
android:inputType="text" />
<Button
android:id="@+id/buttonPanel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Kiểm tra Anagram" />
</LinearLayout>
Bước 3: MainActivity.java - Thuật toán tối ưu
package com.example.myapplication;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
EditText editQuery1, editQuery2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editQuery1 = findViewById(R.id.edit_query);
editQuery2 = findViewById(R.id.edit_query1);
findViewById(R.id.buttonPanel).setOnClickListener(v -> checkAnagram());
}
private void checkAnagram() {
String str1 = editQuery1.getText().toString().trim();
String str2 = editQuery2.getText().toString().trim();
if (str1.isEmpty() || str2.isEmpty()) {
Toast.makeText(this, "Vui lòng nhập cả hai chuỗi", Toast.LENGTH_SHORT).show();
return;
}
boolean isAnagram = areAnagrams(str1, str2);
String message = isAnagram ? "✓ Là Anagram" : "✗ Không phải Anagram";
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
/**
* Kiểm tra anagram bằng cách sort ký tự - O(n log n)
* Cách khác: đếm frequency ký tự - O(n) nhưng tốn bộ nhớ
*/
private boolean areAnagrams(String s1, String s2) {
// Chuẩn hóa: bỏ khoảng trắng, chuyển lowercase
String clean1 = s1.replaceAll("\\s+", "").toLowerCase();
String clean2 = s2.replaceAll("\\s+", "").toLowerCase();
if (clean1.length() != clean2.length()) {
return false;
}
char[] arr1 = clean1.toCharArray();
char[] arr2 = clean2.toCharArray();
Arrays.sort(arr1);
Arrays.sort(arr2);
return Arrays.equals(arr1, arr2);
}
}
Giải thích thuật toán
- Chuẩn hóa: Xóa khoảng trắng, chuyển về chữ thường
- Kiểm tra độ dài: Nếu khác nhau → chắc chắn không anagram
- Sắp xếp: Sort mảng ký tự cả hai chuỗi
- So sánh: Nếu mảng sort giống nhau → là anagram
Phương pháp thay thế: Đếm tần suất (O(n))
private boolean areAnagramsFrequency(String s1, String s2) {
String clean1 = s1.replaceAll("\\s+", "").toLowerCase();
String clean2 = s2.replaceAll("\\s+", "").toLowerCase();
if (clean1.length() != clean2.length()) return false;
int[] count = new int[26]; // Chỉ cho a-z
for (char c : clean1.toCharArray()) {
if (c >= 'a' && c <= 'z') count[c - 'a']++;
}
for (char c : clean2.toCharArray()) {
if (c >= 'a' && c <= 'z') count[c - 'a']--;
}
for (int c : count) {
if (c != 0) return false;
}
return true;
}
Kết quả
Nhập "listen" và "silent" → Toast hiển thị "✓ Là Anagram"
Nhập "hello" và "world" → Toast hiển thị "✗ Không phải Anagram"