Cho một luồng văn bản (text stream) và một từ (word), nhiệm vụ là tìm số lần xuất hiện của các anagram của từ trong luồng văn bản. Anagram được tạo bằng cách sắp xếp lại các chữ cái của một từ thành từ hoặc cụm từ khác, ví dụ anagram của "New York Times" có thể là "Monkeys write".
Ví dụ
Đầu vào: Chuỗi "workitwrokoffowkr", từ "work"
Đầu ra: Số lần xuất hiện anagram: 3
Giải thích: Các anagram của "work": work, wrok, rowk, owkr, v.v. Trong chuỗi cho trước có: work, wrok, owkr → đếm = 3.
Đầu vào: Chuỗi "expresshycool", từ "Zen"
Đầu ra: Số lần xuất hiện anagram: 0
Giải thích: Không có anagram nào của "zen" trong chuỗi.
Phương pháp sử dụng
- Cho chuỗi ký tự (stream) và từ (w) truyền vào hàm
countAna(stream, w). - Trong hàm
countAnakhởi tạo biến đếm. - Vòng lặp
FORtừi = 0đếni <= stream.length() - w.length(). - Gọi hàm
arrangeAna(w, stream.substring(i, i + w.length()))với từ và chuỗi con độ dài bằng từ. - Trong
arrangeAna: chuyển chuỗi thành mảng ký tự, sắp xếp, so sánh bằngArrays.equals(c1, c2). - Nếu khớp tăng biến đếm.
- In kết quả.
Ví dụ mã nguồn (Java)
import java.io.*;
import java.util.*;
public class testClass {
static boolean arrangeAna(String s1, String s2) {
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
Arrays.sort(c1);
Arrays.sort(c2);
return Arrays.equals(c1, c2);
}
static int countAna(String stream, String w) {
int count = 0;
for (int i = 0; i <= (stream.length()) - (w.length()); i++) {
if (arrangeAna(w, stream.substring(i, i + (w.length())))) {
count++;
}
}
return count;
}
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
String stream = scan.next();
String w = scan.next();
System.out.print(countAna(stream, w));
}
}
Chạy mã trên cho kết quả:
Kết quả
Count of occurrences of anagram in the string are: 3