Chồng chéo css

Thuật toán Knuth-Morris-Pratt là một phương pháp tốt để tìm kiếm một chuỗi bên trong một chuỗi khác (vì tôi đã tìm thấy DNA, tôi đoán bạn muốn điều này để mở rộng hàng hóa?)

Nội dung chính Hiển thị

  • Làm thế nào để xác định chuỗi chồng chéo của Python?
  • Làm thế nào để bạn tìm thấy khoảng thời gian chồng chéo trong Python?
  • Làm thế nào để bạn đếm số lượng chuỗi con trong một chuỗi trong Python?
  • Làm thế nào để tôi tìm thấy trong Python?

# Knuth-Morris-Pratt string matching
# David Eppstein, UC Irvine, 1 Mar 2002

from __future__ import generators

def KnuthMorrisPratt(text, pattern):

    '''Yields all starting positions of copies of the pattern in the text.
Calling conventions are similar to string.find, but its arguments can be
lists or iterators, not just strings, it returns all matches, not just
the first one, and it does not need the whole text in memory at once.
Whenever it yields, it will have read the text exactly up to and including
the match that caused the yield.'''

    # allow indexing into pattern and protect against change during yield
    pattern = list(pattern)

    # build table of shift amounts
    shifts = [1] * (len(pattern) + 1)
    shift = 1
    for pos in range(len(pattern)):
        while shift <= pos and pattern[pos] != pattern[pos-shift]:
            shift += shifts[pos-shift]
        shifts[pos+1] = shift

    # do the actual search
    startPos = 0
    matchLen = 0
    for c in text:
        while matchLen == len(pattern) or \
              matchLen >= 0 and pattern[matchLen] != c:
            startPos += shifts[matchLen]
            matchLen -= shifts[matchLen]
        matchLen += 1
        if matchLen == len(pattern):
            yield startPos

Liên kết nơi tôi có mã KMP Python (và tích hợp, sẽ nhanh hơn cho các vấn đề nhỏ vì hằng số thời gian chạy)

Để có biểu hiện Cận huyết, hãy sử dụng bảng tiền tố và băm các cửa sổ của chuỗi của bạn dưới dạng số nguyên cơ sở 4 (trong sinh học, bạn gọi chúng là K-MERS hoặc Oligos). ;

Chúc may mắn

chỉnh sửa. Ngoài ra còn có một thủ thuật hay, bạn sắp xếp danh sách chứa mọi tiền tố (tổng n) trong chuỗi đầu tiên và mọi tiền tố (tổng n) trong chuỗi thứ hai. Nếu họ chia sẻ phần tiếp theo theo chung nhất, thì họ phải liền kề trong danh sách sắp xếp, vì vậy hãy tìm phần tử từ chuỗi khác gần nhất trong danh sách sắp xếp, và sau đó lấy tiền tố dài nhất hoàn tất . . ) Ngoài ra còn có một mẹo hay khi bạn sắp xếp một danh sách chứa mọi tiền tố (tổng n) trong chuỗi đầu tiên và mọi tiền tố (tổng n) trong chuỗi thứ hai. Nếu chúng chia sẻ chuỗi con chung lớn nhất, thì chúng phải liền kề trong danh sách đã sắp xếp, vì vậy hãy tìm phần tử từ chuỗi khác gần nhất trong danh sách đã sắp xếp, sau đó lấy tiền tố dài nhất khớp hoàn toàn. . )

Làm thế nào để bạn đếm số lượng chuỗi con trong một chuỗi trong Python?

Chức năng Python String Count () là một hàm có sẵn trong ngôn ngữ lập trình Python trả về số lần xuất hiện của một chuỗi con trong chuỗi đã chọn. Tham số. Hàm đếm () có một lực lượng bắt buộc và hai tham số tùy chọn

Xin lưu ý rằng công cụ vấn đề có thể nhắm mục tiêu các chuỗi con giáp (nghĩa là chiếm các vị trí liên tiếp) và vốn đã duy trì thứ tự của các yếu tố tố

& nbsp;
For example,

Đầu vào.  

  . [a, b, c], [a, bc], [ab, c], [abc]Đầu ra. [A, B, C], [A, BC], [AB, C], [ABC]

 

  .   . A B C D

  . [a, b, c, d], [a, b, cd], [a, bc, d], [a, bcd], [ab, c, d], [ab, cd], [abc, D . [A, B, C, D], [A, B, CD], [A, BC, D], [A, BCD], [AB, C, D], [AB, CD], [ABC, D

Thực hiện vấn đề này

Ý tưởng là sử dụng đệ quy để giải quyết vấn đề này. Đối với một chuỗi đã cho str có độ dài n, hãy xem xét từng tiền tố str[0, i] của từng người. Chúng tôi nối các tiền tố vào chuỗi đầu ra bằng cách đặt nó trong dấu trích đơn và tái diễn cho chuỗi con còn lại str[i+1, n-1]. Nếu mọi chuỗi con của chuỗi ban đầu đã được xử lý, vui lòng thêm chuỗi đầu vào kết quả

Sau đây là việc thực hiện C++, Java và Python của ý tưởng

C++


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

#bao gồm

#bao gồm

#bao gồm

#bao gồm

usingnamespacestd;không gian tên std;

// Tìm tất cả các kết hợp của các chuỗi con không chồng chéo của một chuỗi đã chọn

voidfindCombinations(stringstr,vector&substring,findCombinations(string str,vector<string>&substring,

        bộ&kết hợp)bộ<vectơ<string>>&combinations)

{

& nbsp; // if all characters of the input string are processed,

& nbsp; // add the output string to result

    nếu(str. length()==0)if (str. độ dài()==0)

    {{

        đầu ra vectơ(chuỗi con);vectơ<chuỗi> output(substring);

        kết hợp. chèn(đầu ra);kết hợp. chèn(đầu ra);

        return;return;

    }}

& nbsp; // append each prefix `str[0, i]` to the output string and recur for

& nbsp; // remaining substring `str[i+1, n-1]`

    for(inti=0;ifor (inti=0;i<str.độ dài();i++)

    {{

& nbsp; // push prefix `str[0, i]` into the output vector

        chuỗi con. đẩy_back(str. substr(0,i+1));chuỗi con. push_back(str. chất nền(0,i +1));

& nbsp; // recur for the remaining string `str[i+1, n-1]`

        tìmKết hợp(str. substr(i+1),chuỗi con,kết hợp);tìmKết hợp(str.chất nền(i+ 1),substring,combinations);

& nbsp; . xóa chuỗi con hiện tại khỏi vectơ đầu ra// backtrack: remove current substring from the output vector

        chuỗi con. pop_back();chuỗi con. pop_back();

    }}

}

setfindCombinations(chuỗi)<vectơ<chuỗi<>>findCombinations(string s)

{

    các tập hợp;tập hợp<vectơ<string>> combinations;

& nbsp; // base case

    nếu(s. độ dài()==0){if (s. độ dài()==0){

        kết hợp trả về;trả vềkết hợp;

    }}

& nbsp; // vector to store non-overlapping substrings

    chuỗi con vector;vector<chuỗi>substring;

& nbsp; // find all non-overlapping substrings

     findCombinations(s,substring,combinations);findCombinations(s,substring,combinations);

    kết hợp trả về;trả vềkết hợp;

}

 

voidprintVector(vectorconst&out) printVector(vector<<string>const&out)

{

& nbsp; . for(auto str:ra){

        coutcout<<str<<" ";

    }}

    coutcout<<endl;

}

intmain()main()

{

& nbsp; // input string

    stringstr="ABCD";chuỗi str="ABCD";

& nbsp; // find all non-overlapping substrings

    setcombinations=findCombinations(str);đặt<vectơ<string>>combinations= findCombinations(str);

    cho(tổ hợp véc-tơ. kết hợp){cho(vectơ<string>combination:kết hợp){

        printVector(kết hợp);printVector(kết hợp);

    }}

    return 0;return 0;

}

 

& nbsp;

A B C D
A B CD
A BC D
A BCD
AB C D
AB CD
ABC D
ABCD

 


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

nhập java. sử dụng. *;java. sử dụng. *;

// Chức năng tiện ích cho nội dung của màn hìnhlớp Chính

{

& nbsp; // Find all combinations of non-overlapping substrings of a given string

    publicstaticvoidfindCombinations(Stringstr,Dequesubstring,publicstatic voidfindCombinations(Stringstr,Dequesubstring,

                                             Các tổ hợp)Tập hợp<Danh sách>combinations)

    {{

& nbsp; // if all characters of the input string are processed,

& nbsp; // add the output string to result

        if(str. length()==0){if (str. độ dài()==0){

             kết hợp. add(newArrayList(substring));kết hợp. thêm(mớiDanh sách mảng<(substring));

             return;return;

        }}

& nbsp; // add each substring `str[0, i]` to the output string and recur for

  // remaining substring `str[i+1, n-1]`

        for(inti=0;ifor(inti=0; i<str.độ dài(); i++)

        {{

  // push substring `str[0, i]` into the output string

            chuỗi con. addLast(str. chuỗi con(0,i+1));chuỗi con. addLast(str. chuỗi con(0,i +1));

  // recur for the remaining string `str[i+1, n-1]`

            findCombinations(str. chuỗi con(i+1),chuỗi con,kết hợp);tìmKết hợp(str.chuỗi con(i+ 1),substring,combinations);

  . xóa chuỗi con hiện tại khỏi đầu ra// backtrack: remove current substring from the output

            chuỗi con. pollLast();chuỗi con. pollLast();

        }}

    }}

    publicstaticSetfindCombinations(Strings)publicstaticSet<<List>findCombinations(Strings)

    {{

        Setcombinations=newHashSet();Đặt<Danh sách>combinations =newHashSet<>();

  // base case

  . if(s==null|| s. độ dài()==0){

             kết hợp trả về;trả vềkết hợp;

        }}

  // string to store non-overlapping substrings

        Dequesubstring=newArrayDeque();Dequechuỗi con=newArrayDeque<>();

& nbsp; // find all non-overlapping substrings

        tìmKết hợp(s,chuỗi con,kết hợp);tìmKết hợp(s,substring,combinations);

        kết hợp trả về;trả vềkết hợp;

    }}

    publicstaticvoidmain(String[]args)publicstatic voidmain(String[]args)

    {{

& nbsp;// chuỗi đầu vào

        Stringstr="ABCD";Chuỗistr="ABCD";

& nbsp; // find all non-overlapping substrings

        Setcombinations=findCombinations(str);Đặt<Danh sách> combinations=findCombinations(str);

        Hệ thống. ngoài. println(kết hợp);Hệ thống. ra. println(kết hợp);

    }}

 

}

Tai xuống  

[[AB, CD], [A, BC, D], [A, BCD], [ABC, D], [A, B, CD], [AB, C, D], [A, B, C, D], [ABCD]]

đầu ra. [[ab, cd], [a, bc, d], [a, bcd], [abc, d], [a, b, cd], [ab, c, d], [a, b, C,


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

con trăn

deffindCombinations(s,combinations,substring=[]). tìm các kết hợp(s,các kết hợp . , substring=[]):

# Tìm tất cả các kết hợp của các chuỗi con không chồng chéo của một chuỗi đã cho# nếu tất cả các ký tự của đầu vào đều được xử lý,

& nbsp; # add the output string to result

    nếu không. nếukhôngs.

& nbsp; # output string to store non-overlapping substrings

        kết hợp. add(tuple(substring))kết hợp. thêm(bộ(chuỗi con))

        trả lạitrả lại

& nbsp; # add each substring `s[0, i]` to the output string and recur for

& nbsp; # remaining substring `s[i+1, n-1]`

    foriinrange(len(s)). choi trongphạm vi( . len(s)):

& nbsp; # push substring `s[0, i]` into the output string

        chuỗi con. nối thêm (s [. i+1])chuỗi con. chắp thêm(s[. i +1])

  # recur for the remaining string `s[i+1, n-1]`

        tìmKết hợp(s[i+1. ],kết hợp,chuỗi con)tìmKết hợp(s[i+1:], kết hợp,chuỗi con)

  . xóa chuỗi con hiện tại khỏi đầu ra# backtrack: remove current substring from the output

        chuỗi con. pop()chuỗi con. bật()

deffindAllCombinations(s). findAllCombinations(s).

  # base case

    nếu không. nếukhôngs.

        returnset()returnset()

  # find all non-overlapping substrings

    kết hợp=set()kết hợp =đặt()

    tìm (các) Kết hợptìm Kết hợp(s, combinations)

    kết hợp trả vềtrả vềkết hợp

if__name__=='__main__'. __name__ =='__main__'.

& nbsp; # input string

    s='ABCD's= 'ABCD'

& nbsp; # find all non-overlapping substrings

    các kết hợp=findAllCombinations(s)các kết hợp= findAllCombinations(s)

    in(kết hợp)in(kết hợp)<

Tải xuống & nbsp;

Đầu ra. {('ab', 'cd'), ('a', 'bcd'), ('a', 'bc', 'd'), ('abc', 'd'), ('ab',

{(‘AB’, ‘CD’), (‘A’, ‘BCD’), (‘A’, ‘BC’, ‘D’), (‘ABC’, ‘D’), (‘AB’, ‘C’, ‘D’), (‘ABCD’,), (‘A’, ‘B’, ‘C’, ‘D’), (‘A’, ‘B’, ‘CD’)}

Độ phức tạp của thời gian giải pháp dựa trên các số nhân vì có chính xác các kết hợp của 2n-1, trong đó n là độ dài của chuỗi đầu vào

Thank vì đã đọc

Vui lòng sử dụng trình biên dịch trực tuyến của chúng tôi để đăng mã trong các nhận xét bằng C, C ++, Java, Python, JavaScript, C#, PHP và nhiều ngôn ngữ lập trình phổ biến hơn

Như chúng tôi?Giới thiệu chúng tôi với bạn bè của bạn và giúp chúng tôi phát triển. Mã hóa hạnh phúc. ). )