2010-10-21 58 views
6

Có cách nào để kiểm tra xem hai chuỗi có chứa cùng một ký tự hay không. Ví dụ:Kiểm tra xem 2 chuỗi có chứa các ký tự giống nhau không?

abc, bca -> true 
aaa, aaa -> true 
aab, bba -> false 
abc, def -> false 
+0

thể trùng lặp của [Kiểm tra nếu hai chuỗi là hoán vị của nhau] (http: // stackoverflow.com/questions/2131997/checking-if-two-strings-are-permutations-of-each-other) – finnw

Trả lời

20

Chuyển từng chuỗi thành char [], sắp xếp mảng đó, sau đó so sánh hai. Đơn giản.

private boolean sameChars(String firstStr, String secondStr) { 
    char[] first = firstStr.toCharArray(); 
    char[] second = secondStr.toCharArray(); 
    Arrays.sort(first); 
    Arrays.sort(second); 
    return Arrays.equals(first, second); 
} 
+0

... và xóa bản sao es trước khi so sánh – testalino

+6

Không, nếu chúng tôi đã xóa các bản sao thì "aab, bba" sẽ trả về true và được chỉ định là trả về false. – GaryF

+0

vâng, bạn có quyền – testalino

1

Bạn có thể chuyển đổi chuỗi thành mảng char, sắp xếp các mảng và họ so sánh các mảng:

String str1 = "abc";     
String str2 = "acb"; 
char[] chars1 = str1.toCharArray(); 
char[] chars2 = str2.toCharArray(); 
Arrays.sort(chars1); 
Arrays.sort(chars2); 

if(Arrays.equals(chars1,chars2)) { 
     System.out.println(str1 + " and " + str2 + " are anagrams"); 
} else { 
     System.out.println(str1 + " and " + str2 + " are not anagrams"); 
} 
0

ở đây:

String str1 = "abc"; 
    String str2 = "cba"; 
    /* create sorted strings */ 

/* old buggy code 
    String sorted_str1 = new String(java.utils.Arrays.sort(str1.toCharArray())); 
    String sorted_str2 = new String(java.utils.Arrays.sort(str2.toCharArray())); 
*/  
/* the new one */ 
char [] arr1 = str1.toCharArray(); 
char [] arr2 = str2.toCharArray(); 
java.utils.Arrays.sort(arr1); 
java.utils.Arrays.sort(arr2); 
String sorted_str1 = new String(arr1); 
String sorted_str2 = new String(arr2); 

if (sorted_str1.equals(sorted_str2)) { 
     /* true */ 
    } else { 
     /* false */ 
    } 
+1

Arrays.sort (..) có kiểu trả về void, vì vậy bạn không thể sử dụng nó trực tiếp trong String constructor. – GaryF

+0

bạn đã đúng. tôi đã sửa mã và đăng lại. –

6

Một rất dễ dàng - nhưng không phải là rất hiệu quả - cách để làm điều đó là, chuyển đổi các số String s của bạn thành mảng char và sử dụng java.util.Arrays.sort trên chúng, lấy lại String s và so sánh cho bình đẳng. Nếu chuỗi của bạn dưới một vài nghìn ký tự, điều đó sẽ rất ổn.

Nếu bạn có vài megabyte chuỗi, bạn có thể muốn tạo một mảng với số đếm cho mỗi ký tự (sử dụng mã của nó làm chỉ mục), có một dấu gạch ngang trên một chuỗi thêm một số vào mỗi char. vượt qua chuỗi thứ hai để xóa một chuỗi. Nếu bạn rơi dưới 0 tại bất kỳ thời điểm nào trong lần vượt qua thứ hai, họ không có các ký tự giống nhau. Khi bạn hoàn thành chuỗi thứ hai mà không có lỗi, bạn chắc chắn chúng có cùng ký tự nếu chúng có cùng độ dài (bạn nên kiểm tra trước). Phương pháp thứ hai phức tạp hơn nhiều so với phân loại các chuỗi, và nó đòi hỏi một mảng lớn nếu bạn muốn làm việc với các chuỗi unicode, nhưng nó hoàn toàn tốt nếu bạn không sao chỉ với 128 ký tự của tập ascii, và nhiều nhanh hơn.
KHÔNG bận tâm với điều đó nếu bạn không có vài triệu ký tự trong chuỗi của bạn. Việc phân loại các chuỗi dễ dàng hơn nhiều và không chậm hơn đáng kể trên các chuỗi chỉ với vài chục ký tự.

+0

+1 để chỉ ra ưu và nhược điểm của các giải pháp khác nhau – sleske

3

Là một (soi mói ;-)) mặt lưu ý:

Hãy nhận biết rằng các giải pháp đề xuất ở đây chỉ làm việc cho chuỗi gồm ký tự từ Basic Multilingual Plane (BMP) của Unicode.

Các ký tự bên ngoài BMP được thể hiện dưới dạng cặp của char trong String, vì vậy bạn cần chú ý nhiều hơn để bạn giữ các cặp với nhau. Xem Javadocs của java.lang.Character để biết chi tiết đẫm máu.

May mắn thay, hầu hết các nhân vật bên ngoài BMP khá kỳ lạ. Thậm chí hầu hết tiếng Nhật và tiếng Trung đều nằm trong BMP ...

+0

Thực ra, các giải pháp ở đây sẽ hoạt động bên ngoài BMP tốt. Vấn đề là chúng sẽ không hoạt động trên các chuỗi không chuẩn hóa; vấn đề là "é" có thể được viết dưới dạng ký tự đơn hoặc thành phần "e" và dấu trọng âm. (Đây là một vấn đề đối với một số ngôn ngữ châu Âu, và một vài ngôn ngữ khác nữa.) –

+0

@Donal Fellows: Làm cách nào để chúng hoạt động bên ngoài BMP? Một ký tự từ bên ngoài BMP sẽ được biểu diễn dưới dạng cặp thay thế, tức là hai 'char'.If bạn gọi ra, ví dụ: 'Arrays.sort (chars1)', chức năng sắp xếp, mà không biết về người thay thế, sẽ vui vẻ xé toạc người thay thế và tạo ra dữ liệu rác. Hay tôi đang thiếu một cái gì đó? – sleske

+0

@Donal Fellows: Nhưng tất nhiên bạn đúng là vấn đề cũng sẽ xảy ra khi kết hợp các nhân vật. Và BTW, sử dụng một chuỗi chuẩn hóa là không đủ, bởi vì có một số chuẩn hóa khác nhau, và một số sử dụng kết hợp các ký tự. – sleske

1

Cân nhắc việc tạo chữ ký cho một chuỗi nhất định. Sử dụng tính và ký tự.

a-count:b-count:c-count:.....:z-count: (mở rộng cho chữ hoa nếu bạn muốn).

Sau đó, so sánh chữ ký. Điều này sẽ mở rộng tốt hơn cho các chuỗi rất lớn.

Làm lối tắt, hãy kiểm tra độ dài. Nếu chúng không khớp, hãy trả về false.

2

Có lẽ đó không phải là câu trả lời nhanh nhất, nhưng phải trả lời ngắn nhất.

boolean hasSameChar(String str1, String str2){ 
    for(char c : str1.toCharArray()){ 
    if(str2.indexOf(c) < 0) return false; 
    } 
    for(char c : str2.toCharArray()){ 
    if(str1.indexOf(c) < 0) return false; 
    } 
    return true; 
} 
0

đây:

import java.util.Arrays; 

public class CompareString {

String str = "Result"; 
String str1 = "Struel"; 

public void compare() { 
    char[] firstString = str.toLowerCase().toCharArray(); 
    char[] secondString = str1.toLowerCase().toCharArray(); 

    Arrays.sort(firstString); 
    Arrays.sort(secondString); 

    if (Arrays.equals(firstString, secondString) == true) { 
     System.out.println("Both the string contain same charecter"); 
    } else { 
     System.out.println("Both the string contains different charecter"); 
    } 
} 

public static void main(String[] args) { 
    CompareString compareString = new CompareString(); 
    compareString.compare(); 
} 

}

Các vấn đề liên quan