Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách kiểm tra hai chuỗi có phải Anagram trong Android

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

  1. Chuẩn hóa: Xóa khoảng trắng, chuyển về chữ thường
  2. Kiểm tra độ dài: Nếu khác nhau → chắc chắn không anagram
  3. Sắp xếp: Sort mảng ký tự cả hai chuỗi
  4. 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"