Hướng dẫn fun with anagrams python - vui vẻ với con trăn đảo ngữ
Câu hỏi là: Cho một loạt các chuỗi, xóa từng chuỗi là một cách của một chuỗi trước đó, sau đó trả về mảng còn lại theo thứ tự được sắp xếp. Show
Ví dụ str = ['code', 'doce', 'ecod', 'framer', 'frame']]]]] Mã và Doce là đảo chữ. Hủy bỏ Doce khỏi mảng và giữ mã xuất hiện đầu tiên trong mảng. Mã và ECOD là đảo chữ. Hủy bỏ ECOD khỏi mảng và giữ mã xuất hiện đầu tiên trong mảng. Mã và framer không phải là đảo chữ. Giữ cả hai chuỗi trong mảng. Framer và khung không phải là đảo chữ do r trong framer. Giữ cả hai chuỗi trong mảng. Đặt hàng các chuỗi còn lại theo thứ tự tăng dần: ['mã', 'khung', 'framer']. Mã giải pháp là:
Tôi muốn hiểu trong hàm funwithanagrams, văn bản [i+1:] hữu ích như thế nào?
sẽ đạt được đầu ra tương tự. PS-Đây không phải là mã của tôi. Tôi đã tìm thấy nó trực tuyến và thực sự muốn biết văn bản [i+1:] sẽ tác động đến đầu ra như thế nào?
This theorem states that every integer larger than 1 can be written as a product of one or more primes. More strongly, this product is unique in the sense that any two prime factorizations of the same number will have the same numbers of copies of the same primes, although their ordering may differChúng ta sẽ sử dụng tính chất này để có thể group các từ là anagram của nhau lại. Cách tiếp cận đó là gắn 26 chữ cái với 26 số nguyên tố bất kỳ. Sau đó chúng ta lặp qua từng từ và tính tích của các số nguyên tố tương ứng với các chữ cái trong từ. Các từ có tích bằng nhau thì là anagram của nhau theo tính chất unique factorization ở trên. Ví dụ: Lưu ý: từ Python 3.8, math.prod mới được thêm vào Lời giải của mình cho hướng tiếp cận này là: Trong bài blog này, mình sẽ đưa ra những cách giải tiêu biểu của bài toán này sử dụng ngôn ngữ Python. Đề bàiViết một chương trình nhận một list các từ và trả ra các list gồm các list con gồm các từ, cụm từ anagram của nhau. Input: ["yo", "act", "flop", "tac", "foo", "cat", "oy", "olfp"] Output mong muốn: [ Bài này có khá nhiều cách để giải bài toán này nhưng bài blog này mình chỉ đưa ra 2 cách tiêu biểu và khá tối ưu về mặt space và time complexity. Cách tiếp cận 1: sort stringCác từ anagram là sử dụng chung một tập chữ cái và có thứ tự sắp xếp khác nhau do đó khi chúng ta sort 1 cặp anagram string trong Python thì sẽ cho ra kết quả giống nhau. In [1]: sorted('evil') Do đó cách tiếp cận này sẽ nhóm các từ anagram với nhau sử dụng key là sorted string của nó. Lời giải của mình như sau: from collections import defaultdict Input: ["yo", "act", "flop", "tac", "foo", "cat", "oy", "olfp"] Output: [ Phân tích space và time complexityChú thích: với w là số lượng từ đầu vào, n là độ dài của từ lớn nhất. Space complexity là O(wn): do space complexity của mỗi từ là O(n). Do đó, the space complexity của w từ là O(wn). Time complexity là O(w * nlogn):
Do đó time complexity của lời giải là O(w * n * logn). Cách tiếp cận 2: sử dụng số nguyên tố để kiểm tra anagramSố nguyên tố có một tính chất cơ bản là unique factorization (tạm dịch: tính phân tích duy nhất). Tính chất này phát biểu rằng mọi số lớn hơn 1 đều có thể được viết thành tích của một hoặc nhiều số nguyên tố và tích đó là duy nhất. This theorem states that every integer larger than 1 can be written as a product of one or more primes. More strongly, this product is unique in the sense that any two prime factorizations of the same number will have the same numbers of copies of the same primes, although their ordering may differ Chúng ta sẽ sử dụng tính chất này để có thể group các từ là anagram của nhau lại. Cách tiếp cận đó là gắn 26 chữ cái với 26 số nguyên tố bất kỳ. Sau đó chúng ta lặp qua từng từ và tính tích của các số nguyên tố tương ứng với các chữ cái trong từ. Các từ có tích bằng nhau thì là anagram của nhau theo tính chất unique factorization ở trên. Ví dụ: In [1]: import math Lưu ý: từ Python 3.8, math.prod mới được thêm vào Lời giải của mình cho hướng tiếp cận này là: import math Input: 0Output: 1Phân tích space và time complexityChú thích: với w là số lượng từ đầu vào, n là độ dài của từ lớn nhất Space complexity bằng với cách trên, là: O(wn). Time complexity là O(wn). Giải thích:
Do đó time complexity là O(w * n) Kết luậnHai cách giải trên chưa phải là tất cả các cách để kiểm tra và group các anagrams nhưng mong rằng bài blog này có thể giúp bạn trên một phương diện nào đó. Nếu bạn thấy bài blog thú vị hãy chia sẻ để nhiều người biết đến hơn nhé Và hãy đón chờ thêm các bài blog của mình về chủ đề Data Structure & Algorithm trên Tech blog của BizFly Cloud nha! |