Cách tìm tất cả hoán vị của chuỗi Java [Có code mẫu]
2 phút đọc30/07/2025
Về tác giả
I have over 5 years of experience writing technical documentation for tech products, making them accessible and user-friendly. My focus is always on providing clear and precise information.
@#@
Tôi đã có hơn 5 năm kinh nghiệm viết tài liệu kỹ thuật cho các sản phẩm công nghệ, giúp người dùng dễ dàng tiếp cận và sử dụng. Tôi luôn tập trung vào việc cung cấp thông tin chính xác và dễ hiểu.
Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn
{"success":true,"head":"<title>Cách tìm tất cả hoán vị của chuỗi Java [Có code mẫu] - CyStack Tutorial</title>\n<meta name=\"description\" content=\"Trong hướng dẫn này, chúng ta sẽ học cách tìm tất cả hoán vị của chuỗi Java. Đây là một câu hỏi "mẹo" thường xuất hiện trong các buổi phỏng vấn Java.\"/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-video-preview:-1, max-image-preview:large\"/>\n<link rel=\"canonical\" href=\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Cách tìm tất cả hoán vị của chuỗi Java [Có code mẫu] - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"Trong hướng dẫn này, chúng ta sẽ học cách tìm tất cả hoán vị của chuỗi Java. Đây là một câu hỏi "mẹo" thường xuất hiện trong các buổi phỏng vấn Java.\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/\" />\n<meta property=\"og:site_name\" content=\"CyStack Tutorial\" />\n<meta property=\"article:tag\" content=\"vi\" />\n<meta property=\"article:section\" content=\"Java\" />\n<meta property=\"og:updated_time\" content=\"2026-08-03T17:31:06+07:00\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/30165425/hoan-vi-cua-chuoi-java.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/30165425/hoan-vi-cua-chuoi-java.jpg\" />\n<meta property=\"og:image:width\" content=\"1200\" />\n<meta property=\"og:image:height\" content=\"630\" />\n<meta property=\"og:image:alt\" content=\"hoán vị của chuỗi Java\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-07-30T16:55:58+07:00\" />\n<meta property=\"article:modified_time\" content=\"2026-08-03T17:31:06+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"Cách tìm tất cả hoán vị của chuỗi Java [Có code mẫu] - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"Trong hướng dẫn này, chúng ta sẽ học cách tìm tất cả hoán vị của chuỗi Java. Đây là một câu hỏi "mẹo" thường xuất hiện trong các buổi phỏng vấn Java.\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/30165425/hoan-vi-cua-chuoi-java.jpg\" />\n<meta name=\"twitter:label1\" content=\"Written by\" />\n<meta name=\"twitter:data1\" content=\"Chris Pham\" />\n<meta name=\"twitter:label2\" content=\"Time to read\" />\n<meta name=\"twitter:data2\" content=\"2 minutes\" />\n<script type=\"application/ld+json\" class=\"rank-math-schema\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://blog.cystack.org/tutorial/#person\",\"name\":\"CyStack Tutorial\"},{\"@type\":\"WebSite\",\"@id\":\"https://blog.cystack.org/tutorial/#website\",\"url\":\"https://blog.cystack.org/tutorial\",\"name\":\"CyStack Tutorial\",\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https://s2.cystack.net/tutorial/30165425/hoan-vi-cua-chuoi-java.jpg\",\"url\":\"https://s2.cystack.net/tutorial/30165425/hoan-vi-cua-chuoi-java.jpg\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"ho\\u00e1n v\\u1ecb c\\u1ee7a chu\\u1ed7i Java\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":\"1\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":\"2\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/category/java/\",\"name\":\"Java\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/\",\"name\":\"C\\u00e1ch t\\u00ecm t\\u1ea5t c\\u1ea3 ho\\u00e1n v\\u1ecb c\\u1ee7a chu\\u1ed7i Java [C\\u00f3 code m\\u1eabu]\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/\",\"name\":\"C\\u00e1ch t\\u00ecm t\\u1ea5t c\\u1ea3 ho\\u00e1n v\\u1ecb c\\u1ee7a chu\\u1ed7i Java [C\\u00f3 code m\\u1eabu] - CyStack Tutorial\",\"datePublished\":\"2025-07-30T16:55:58+07:00\",\"dateModified\":\"2026-08-03T17:31:06+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/30165425/hoan-vi-cua-chuoi-java.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/#breadcrumb\"}},{\"@type\":\"Person\",\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\",\"url\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"url\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"caption\":\"Chris Pham\",\"inLanguage\":\"en-US\"}},{\"@type\":\"BlogPosting\",\"headline\":\"C\\u00e1ch t\\u00ecm t\\u1ea5t c\\u1ea3 ho\\u00e1n v\\u1ecb c\\u1ee7a chu\\u1ed7i Java [C\\u00f3 code m\\u1eabu] - CyStack Tutorial\",\"keywords\":\"ho\\u00e1n v\\u1ecb c\\u1ee7a chu\\u1ed7i Java,ho\\u00e1n v\\u1ecb trong Java,ho\\u00e1n v\\u1ecb c\\u1ee7a String,ho\\u00e1n v\\u1ecb c\\u1ee7a String trong Java\",\"datePublished\":\"2025-07-30T16:55:58+07:00\",\"dateModified\":\"2026-08-03T17:31:06+07:00\",\"articleSection\":\"Java\",\"author\":{\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\"},\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"description\":\"Trong h\\u01b0\\u1edbng d\\u1eabn n\\u00e0y, ch\\u00fang ta s\\u1ebd h\\u1ecdc c\\u00e1ch t\\u00ecm t\\u1ea5t c\\u1ea3 ho\\u00e1n v\\u1ecb c\\u1ee7a chu\\u1ed7i Java. \\u0110\\u00e2y l\\u00e0 m\\u1ed9t c\\u00e2u h\\u1ecfi "m\\u1eb9o" th\\u01b0\\u1eddng xu\\u1ea5t hi\\u1ec7n trong c\\u00e1c bu\\u1ed5i ph\\u1ecfng v\\u1ea5n Java.\",\"name\":\"C\\u00e1ch t\\u00ecm t\\u1ea5t c\\u1ea3 ho\\u00e1n v\\u1ecb c\\u1ee7a chu\\u1ed7i Java [C\\u00f3 code m\\u1eabu] - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/30165425/hoan-vi-cua-chuoi-java.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/07/30/hoan-vi-cua-chuoi-java/#webpage\"}}]}</script>\n"}
Trong hướng dẫn này, chúng ta sẽ học cách tìm tất cả hoán vị của chuỗi Java. Đây là một câu hỏi “mẹo” thường xuất hiện trong các buổi phỏng vấn Java.

Thuật toán tạo hoán vị cho String trong Java
Chúng ta sẽ bắt đầu bằng cách lấy ký tự đầu tiên của chuỗi và hoán vị phần còn lại.
Ví dụ, nếu chuỗi là "ABC" thì:
- Ký tự đầu tiên là
A
- Các hoán vị của phần còn lại (
"BC") là "BC" và "CB"
Sau đó, ta chèn ký tự đầu tiên vào tất cả các vị trí có thể trong từng hoán vị con:
"BC" → "ABC", "BAC", "BCA"
"CB" → "ACB", "CAB", "CBA"
Chúng ta có thể viết một hàm đệ quy để trả về các hoán vị của phần chuỗi còn lại, sau đó viết thêm một hàm khác để chèn ký tự đầu tiên vào tất cả các vị trí có thể trong các hoán vị đó, nhằm tạo ra danh sách đầy đủ các hoán vị của chuỗi ban đầu.
Chương trình Java để in ra tất cả hoán vị của String
package com.journaldev.java.string;
import java.util.HashSet;
import java.util.Set;
/**
- Java Program to find all permutations of a String
- @author Pankaj
*/
public class StringFindAllPermutations {
public static Set<String> permutationFinder(String str) {
Set<String> perm = new HashSet<String>();
//Handling error scenarios
if (str == null) {
return null;
} else if (str.length() == 0) {
perm.add("");
return perm;
}
char initial = str.charAt(0); // first character
String rem = str.substring(1); // Full string without first character
Set<String> words = permutationFinder(rem);
for (String strNew : words) {
for (int i = 0;i<=strNew.length();i++){
perm.add(charInsert(strNew, initial, i));
}
}
return perm;
}
public static String charInsert(String str, char c, int j) {
String begin = str.substring(0, j);
String end = str.substring(j);
return begin + c + end;
}
public static void main(String[] args) {
String s = "AAC";
String s1 = "ABC";
String s2 = "ABCD";
System.out.println("\\nPermutations for " + s + " are: \\n" + permutationFinder(s));
System.out.println("\\nPermutations for " + s1 + " are: \\n" + permutationFinder(s1));
System.out.println("\\nPermutations for " + s2 + " are: \\n" + permutationFinder(s2));
}
}
Tôi đã sử dụng Set để lưu trữ các hoán vị của chuỗi, nhằm tự động loại bỏ các giá trị trùng lặp.
Kết quả đầu ra
Permutations for AAC are:
[AAC, ACA, CAA]
Permutations for ABC are:
[ACB, ABC, BCA, CBA, CAB, BAC]
Permutations for ABCD are:
[DABC, CADB, BCAD, DBAC, BACD, ABCD, ABDC, DCBA, ADBC, ADCB, CBDA, CBAD, DACB, ACBD, CDBA, CDAB, DCAB, ACDB, DBCA, BDAC, CABD, BADC, BCDA, BDCA]
Vậy là chúng ta đã hoàn thành việc tìm tất cả các hoán vị của String trong Java.