Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?

Xem thảo luận

Cải thiện bài viết

Lưu bài viết

  • Đọc
  • Bàn luận
  • Xem thảo luận

    Cải thiện bài viết

    Lưu bài viết

    Đọc

    Bàn luận
    We can perform this task using selective slicing and brute force manner. This is the naive method to find the string in which we try to get the root string by repetitive division of string.

    Trong khi làm việc với các chuỗi, nhiều lần, chúng ta có thể bắt gặp một trường hợp sử dụng trong đó chúng ta cần tìm nếu một chuỗi có trong đó là chuỗi con lặp lại, lặp đi lặp lại trên tất cả các chuỗi và do đó tạo ra bội số của phần nền gốc. Hãy để thảo luận về những cách nhất định mà chúng ta có thể có được phần nền gốc của chuỗi.

    Phương pháp số 1: Sử dụng danh sách hiểu + Brute Forcewe có thể thực hiện nhiệm vụ này bằng cách sử dụng cách cắt chọn lọc và cách thức vũ phu. Đây là phương pháp ngây thơ để tìm chuỗi trong đó chúng tôi cố gắng lấy chuỗi gốc bằng cách phân chia chuỗi lặp đi lặp lại.

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    7
    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    8
    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    9

    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    0
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    1
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    2
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    3
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    4

    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    5
    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    8
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    7

    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    8
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    9
    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    0
    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    1
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    1
    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    3__

    import re
    
    REPEATER = re.compile(r"(.+?)\1+$")
    
    def repeated(s):
        match = REPEATER.match(s)
        return match.group(1) if match else None
    
    3
    import re
    
    REPEATER = re.compile(r"(.+?)\1+$")
    
    def repeated(s):
        match = REPEATER.match(s)
        return match.group(1) if match else None
    
    4
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    1
    import re
    
    REPEATER = re.compile(r"(.+?)\1+$")
    
    def repeated(s):
        match = REPEATER.match(s)
        return match.group(1) if match else None
    
    6
    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    5
    import re
    
    REPEATER = re.compile(r"(.+?)\1+$")
    
    def repeated(s):
        match = REPEATER.match(s)
        return match.group(1) if match else None
    
    8______59

    Các

    from math import sqrt, floor
    
    def divquot(n):
        if n > 1:
            yield 1, n
        swapped = []
        for d in range(2, int(floor(sqrt(n))) + 1):
            q, r = divmod(n, d)
            if r == 0:
                yield d, q
                swapped.append((q, d))
        while swapped:
            yield swapped.pop()
    
    def repeats(s):
        n = len(s)
        for d, q in divquot(n):
            sl = s[0:d]
            if sl * q == s:
                return sl
        return None
    
    2
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    5
    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    8
    examples = [
        '0045662100456621004566210045662100456621',
        '0072992700729927007299270072992700729927',
        '001443001443001443001443001443001443001443',
        '037037037037037037037037037037037037037037037',
        '047619047619047619047619047619047619047619',
        '002457002457002457002457002457002457002457',
        '001221001221001221001221001221001221001221',
        '001230012300123001230012300123001230012300123',
        '0013947001394700139470013947001394700139470013947',
        '001001001001001001001001001001001001001001001001001',
        '001406469760900140646976090014064697609',
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    for e in examples:
        sub = repeated(e)
        if sub:
            print("%r: %r" % (e, sub))
        else:
            print("%r does not repeat." % e)
    
    5
    examples = [
        '0045662100456621004566210045662100456621',
        '0072992700729927007299270072992700729927',
        '001443001443001443001443001443001443001443',
        '037037037037037037037037037037037037037037037',
        '047619047619047619047619047619047619047619',
        '002457002457002457002457002457002457002457',
        '001221001221001221001221001221001221001221',
        '001230012300123001230012300123001230012300123',
        '0013947001394700139470013947001394700139470013947',
        '001001001001001001001001001001001001001001001001001',
        '001406469760900140646976090014064697609',
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    for e in examples:
        sub = repeated(e)
        if sub:
            print("%r: %r" % (e, sub))
        else:
            print("%r does not repeat." % e)
    
    2
    from math import sqrt, floor
    
    def divquot(n):
        if n > 1:
            yield 1, n
        swapped = []
        for d in range(2, int(floor(sqrt(n))) + 1):
            q, r = divmod(n, d)
            if r == 0:
                yield d, q
                swapped.append((q, d))
        while swapped:
            yield swapped.pop()
    
    def repeats(s):
        n = len(s)
        for d, q in divquot(n):
            sl = s[0:d]
            if sl * q == s:
                return sl
        return None
    
    7

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    

    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    0
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    1
    mean performance:
     0.0003  david_zhang
     0.0009  zero
     0.0013  antti
     0.0013  tigerhawk_2
     0.0015  carpetpython
     0.0029  tigerhawk_1
     0.0031  davidism
     0.0035  saksham
     0.0046  shashank
     0.0052  riad
     0.0056  piotr
    
    median performance:
     0.0003  david_zhang
     0.0008  zero
     0.0013  antti
     0.0013  tigerhawk_2
     0.0014  carpetpython
     0.0027  tigerhawk_1
     0.0031  davidism
     0.0038  saksham
     0.0044  shashank
     0.0054  riad
     0.0058  piotr
    
    0
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    3
    mean performance:
     0.0003  david_zhang
     0.0009  zero
     0.0013  antti
     0.0013  tigerhawk_2
     0.0015  carpetpython
     0.0029  tigerhawk_1
     0.0031  davidism
     0.0035  saksham
     0.0046  shashank
     0.0052  riad
     0.0056  piotr
    
    median performance:
     0.0003  david_zhang
     0.0008  zero
     0.0013  antti
     0.0013  tigerhawk_2
     0.0014  carpetpython
     0.0027  tigerhawk_1
     0.0031  davidism
     0.0038  saksham
     0.0044  shashank
     0.0054  riad
     0.0058  piotr
    
    2

    Đầu ra:
    Doesn’t work for string length < 2.

    Trong khi làm việc với các chuỗi, nhiều lần, chúng ta có thể bắt gặp một trường hợp sử dụng trong đó chúng ta cần tìm nếu một chuỗi có trong đó là chuỗi con lặp lại, lặp đi lặp lại trên tất cả các chuỗi và do đó tạo ra bội số của phần nền gốc. Hãy để thảo luận về những cách nhất định mà chúng ta có thể có được phần nền gốc của chuỗi.

    Phương pháp số 1: Sử dụng danh sách hiểu + Brute Forcewe có thể thực hiện nhiệm vụ này bằng cách sử dụng cách cắt chọn lọc và cách thức vũ phu. Đây là phương pháp ngây thơ để tìm chuỗi trong đó chúng tôi cố gắng lấy chuỗi gốc bằng cách phân chia chuỗi lặp đi lặp lại.

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    7
    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    8
    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    9

    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    0
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    1
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    2
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    3
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    4

    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    5
    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    8
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    7

    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    8
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    9
    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    0
    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    1
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    1
    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    3__

    Các

    from math import sqrt, floor
    
    def divquot(n):
        if n > 1:
            yield 1, n
        swapped = []
        for d in range(2, int(floor(sqrt(n))) + 1):
            q, r = divmod(n, d)
            if r == 0:
                yield d, q
                swapped.append((q, d))
        while swapped:
            yield swapped.pop()
    
    def repeats(s):
        n = len(s)
        for d, q in divquot(n):
            sl = s[0:d]
            if sl * q == s:
                return sl
        return None
    
    2
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    5
    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    8
    examples = [
        '0045662100456621004566210045662100456621',
        '0072992700729927007299270072992700729927',
        '001443001443001443001443001443001443001443',
        '037037037037037037037037037037037037037037037',
        '047619047619047619047619047619047619047619',
        '002457002457002457002457002457002457002457',
        '001221001221001221001221001221001221001221',
        '001230012300123001230012300123001230012300123',
        '0013947001394700139470013947001394700139470013947',
        '001001001001001001001001001001001001001001001001001',
        '001406469760900140646976090014064697609',
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    for e in examples:
        sub = repeated(e)
        if sub:
            print("%r: %r" % (e, sub))
        else:
            print("%r does not repeat." % e)
    
    5
    examples = [
        '0045662100456621004566210045662100456621',
        '0072992700729927007299270072992700729927',
        '001443001443001443001443001443001443001443',
        '037037037037037037037037037037037037037037037',
        '047619047619047619047619047619047619047619',
        '002457002457002457002457002457002457002457',
        '001221001221001221001221001221001221001221',
        '001230012300123001230012300123001230012300123',
        '0013947001394700139470013947001394700139470013947',
        '001001001001001001001001001001001001001001001001001',
        '001406469760900140646976090014064697609',
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    for e in examples:
        sub = repeated(e)
        if sub:
            print("%r: %r" % (e, sub))
        else:
            print("%r does not repeat." % e)
    
    2
    from math import sqrt, floor
    
    def divquot(n):
        if n > 1:
            yield 1, n
        swapped = []
        for d in range(2, int(floor(sqrt(n))) + 1):
            q, r = divmod(n, d)
            if r == 0:
                yield d, q
                swapped.append((q, d))
        while swapped:
            yield swapped.pop()
    
    def repeats(s):
        n = len(s)
        for d, q in divquot(n):
            sl = s[0:d]
            if sl * q == s:
                return sl
        return None
    
    7

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    


    Tôi đang tìm cách để kiểm tra xem một chuỗi nhất định có lặp lại cho toàn bộ chuỗi hay không.

    Examples:

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    

    là các chuỗi lặp lại, và

    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    

    là những ví dụ về những người không.

    Các phần lặp lại của các chuỗi tôi được đưa ra có thể khá dài và bản thân các chuỗi có thể là 500 ký tự trở lên, do đó việc lặp qua mỗi ký tự cố gắng xây dựng một mẫu sau đó kiểm tra mẫu so với phần còn lại của chuỗi có vẻ chậm khủng khiếp. Nhân số đó với hàng trăm chuỗi và tôi không thể thấy bất kỳ giải pháp trực quan nào.

    Tôi đã nhìn vào Regexes một chút và chúng có vẻ tốt khi bạn biết những gì bạn đang tìm kiếm, hoặc ít nhất là chiều dài của mẫu bạn đang tìm kiếm. Thật không may, tôi cũng không biết.

    Làm thế nào tôi có thể biết nếu một chuỗi đang lặp lại chính nó và nếu có, phần tiếp theo lặp lại ngắn nhất là gì?

    Hỏi ngày 6 tháng 4 năm 2015 lúc 23:02Apr 6, 2015 at 23:02

    JohnjohnJohn

    Phù bằng vàng 14.8k1144 Huy hiệu bạc64 Huy hiệu đồng11 gold badges44 silver badges64 bronze badges

    24

    Đây là một giải pháp ngắn gọn để tránh các biểu thức thường xuyên và các vòng lặp trong python chậm:

    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    

    Xem câu trả lời wiki cộng đồng bắt đầu bởi @Davidism để biết kết quả điểm chuẩn. Tóm tắt,

    Giải pháp của David Zhang là người chiến thắng rõ ràng, vượt trội so với tất cả những người khác bằng ít nhất 5 lần cho bộ ví dụ lớn.

    (Câu trả lời đó, không phải của tôi.)

    Điều này dựa trên quan sát rằng một chuỗi là định kỳ khi và chỉ khi nó bằng một vòng quay không cần thiết của chính nó. Kudos đến @aleksitorhamo vì đã nhận ra rằng sau đó chúng ta có thể phục hồi giai đoạn chính từ chỉ số của lần xuất hiện đầu tiên của

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    30 trong
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    31 và để thông báo cho tôi về các đối số
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    32 và
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    33 của Python.

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?

    Đã trả lời ngày 7 tháng 4 năm 2015 lúc 10:58Apr 7, 2015 at 10:58

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?

    David Zhangdavid ZhangDavid Zhang

    4.2841 Huy hiệu vàng13 Huy hiệu bạc16 Huy hiệu đồng1 gold badge13 silver badges16 bronze badges

    29

    Đây là một giải pháp sử dụng các biểu thức thông thường.

    import re
    
    REPEATER = re.compile(r"(.+?)\1+$")
    
    def repeated(s):
        match = REPEATER.match(s)
        return match.group(1) if match else None
    

    Lặp lại các ví dụ trong câu hỏi:

    examples = [
        '0045662100456621004566210045662100456621',
        '0072992700729927007299270072992700729927',
        '001443001443001443001443001443001443001443',
        '037037037037037037037037037037037037037037037',
        '047619047619047619047619047619047619047619',
        '002457002457002457002457002457002457002457',
        '001221001221001221001221001221001221001221',
        '001230012300123001230012300123001230012300123',
        '0013947001394700139470013947001394700139470013947',
        '001001001001001001001001001001001001001001001001001',
        '001406469760900140646976090014064697609',
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    for e in examples:
        sub = repeated(e)
        if sub:
            print("%r: %r" % (e, sub))
        else:
            print("%r does not repeat." % e)
    

    ... Sản xuất đầu ra này:

    '0045662100456621004566210045662100456621': '00456621'
    '0072992700729927007299270072992700729927': '00729927'
    '001443001443001443001443001443001443001443': '001443'
    '037037037037037037037037037037037037037037037': '037'
    '047619047619047619047619047619047619047619': '047619'
    '002457002457002457002457002457002457002457': '002457'
    '001221001221001221001221001221001221001221': '001221'
    '001230012300123001230012300123001230012300123': '00123'
    '0013947001394700139470013947001394700139470013947': '0013947'
    '001001001001001001001001001001001001001001001001001': '001'
    '001406469760900140646976090014064697609': '0014064697609'
    '004608294930875576036866359447' does not repeat.
    '00469483568075117370892018779342723' does not repeat.
    '004739336492890995260663507109' does not repeat.
    '001508295625942684766214177978883861236802413273' does not repeat.
    '007518796992481203' does not repeat.
    '0071942446043165467625899280575539568345323741' does not repeat.
    '0434782608695652173913' does not repeat.
    '0344827586206896551724137931' does not repeat.
    '002481389578163771712158808933' does not repeat.
    '002932551319648093841642228739' does not repeat.
    '0035587188612099644128113879' does not repeat.
    '003484320557491289198606271777' does not repeat.
    '00115074798619102416570771' does not repeat.
    

    Biểu thức chính quy

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    35 được chia thành ba phần:

    1. The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
      The root substring of string : GeeksforGeeks
      
      36 là một nhóm phù hợp chứa ít nhất một (nhưng càng ít càng tốt) của bất kỳ nhân vật nào (vì
      The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
      The root substring of string : GeeksforGeeks
      
      37 là không màu xanh lá cây).

    2. The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
      The root substring of string : GeeksforGeeks
      
      38 Kiểm tra ít nhất một lần lặp lại của nhóm phù hợp trong phần đầu tiên.

    3. The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
      The root substring of string : GeeksforGeeks
      
      39 Kiểm tra kết thúc chuỗi, để đảm bảo rằng không có nội dung bổ sung, không lặp lại sau các nền tảng lặp đi lặp lại (và sử dụng
      The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
      The root substring of string : GeeksforGeeks
      
      40 đảm bảo rằng không có văn bản không lặp lại trước các nền tảng lặp đi lặp lại).

    Trong Python 3,4 trở lên, bạn có thể bỏ

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    39 và sử dụng
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    42 thay thế, hoặc (trong bất kỳ Python nào ít nhất là 2.3) đi theo cách khác và sử dụng
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    43 với Regex
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    44 Hơn bất cứ điều gì khác.

    Đã trả lời ngày 6 tháng 4 năm 2015 lúc 23:18Apr 6, 2015 at 23:18

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?

    Zero Piraeuszero PiraeusZero Piraeus

    53.6K27 Huy hiệu vàng149 Huy hiệu bạc159 Huy hiệu đồng27 gold badges149 silver badges159 bronze badges

    7

    Bạn có thể thực hiện quan sát rằng để một chuỗi được coi là lặp lại, độ dài của nó phải được chia hết cho độ dài của chuỗi lặp lại của nó. Cho rằng, đây là một giải pháp tạo ra các chia độ dài từ

    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    3 đến
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    46 bao gồm, chia chuỗi ban đầu thành các chuỗi con với độ dài của các ước số và kiểm tra sự bình đẳng của tập kết quả:

    from math import sqrt, floor
    
    def divquot(n):
        if n > 1:
            yield 1, n
        swapped = []
        for d in range(2, int(floor(sqrt(n))) + 1):
            q, r = divmod(n, d)
            if r == 0:
                yield d, q
                swapped.append((q, d))
        while swapped:
            yield swapped.pop()
    
    def repeats(s):
        n = len(s)
        for d, q in divquot(n):
            sl = s[0:d]
            if sl * q == s:
                return sl
        return None
    

    Chỉnh sửa: Trong Python 3, toán tử

    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    7 đã thay đổi thành phân chia float theo mặc định. Để có được bộ phận
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    48 từ Python 2, bạn có thể sử dụng toán tử
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    49. Cảm ơn @Tigerhawkt3 vì đã chú ý đến điều này.
    In Python 3, the
    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    7 operator has changed to do float division by default. To get the
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    48 division from Python 2, you can use the
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    49 operator instead. Thank you to @TigerhawkT3 for bringing this to my attention.

    Toán tử

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    49 thực hiện phân chia số nguyên trong cả Python 2 và Python 3, vì vậy tôi đã cập nhật câu trả lời để hỗ trợ cả hai phiên bản. Phần mà chúng tôi kiểm tra để xem liệu tất cả các chuỗi con có bằng nhau không phải là một hoạt động ngắn mạch bằng cách sử dụng
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    51 và biểu thức máy phát.

    CẬP NHẬT: Để đáp ứng với sự thay đổi trong câu hỏi ban đầu, mã hiện đã được cập nhật để trả về phần phụ lặp lại nhỏ nhất nếu nó tồn tại và

    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    7 nếu không. @GodlyGeek đã đề xuất sử dụng
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    53 để giảm số lần lặp trên trình tạo
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    54 và mã cũng được cập nhật để phù hợp với điều đó. Bây giờ nó trả về tất cả các ước số tích cực của
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    55 theo thứ tự tăng dần, không bao gồm chính
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    55.
    In response to a change in the original question, the code has now been updated to return the smallest repeating substring if it exists and
    [
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    7 if it does not. @godlygeek has suggested using
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    53 to reduce the number of iterations on the
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    54 generator, and the code has been updated to match that as well. It now returns all positive divisors of
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    55 in ascending order, exclusive of
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    55 itself.

    Cập nhật thêm cho hiệu suất cao: Sau nhiều thử nghiệm, tôi đã đi đến kết luận rằng chỉ cần kiểm tra công bằng chuỗi có hiệu suất tốt nhất trong bất kỳ giải pháp cắt hoặc lặp lại trong Python. Do đó, tôi đã lấy một chiếc lá ra khỏi cuốn sách của @Tigerhawkt3 và cập nhật giải pháp của mình. Bây giờ nó đã nhanh hơn trước đây, nhanh hơn đáng kể so với giải pháp của Tigerhawk nhưng chậm hơn David. After multiple tests, I've come to the conclusion that simply testing for string equality has the best performance out of any slicing or iterator solution in Python. Thus, I've taken a leaf out of @TigerhawkT3 's book and updated my solution. It's now over 6x as fast as before, noticably faster than Tigerhawk's solution but slower than David's.

    Đã trả lời ngày 6 tháng 4 năm 2015 lúc 23:22Apr 6, 2015 at 23:22

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?

    ShashankshashankShashank

    13.4K5 Huy hiệu vàng36 Huy hiệu bạc61 Huy hiệu Đồng5 gold badges36 silver badges61 bronze badges

    21

    Dưới đây là một số điểm chuẩn cho các câu trả lời khác nhau cho câu hỏi này. Có một số kết quả đáng ngạc nhiên, bao gồm hiệu suất cực kỳ khác nhau tùy thuộc vào chuỗi đang được kiểm tra.

    Một số chức năng đã được sửa đổi để hoạt động với Python 3 (chủ yếu bằng cách thay thế

    def principal_period(s):
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]
    
    7 bằng
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    49 để đảm bảo phân chia số nguyên). Nếu bạn thấy điều gì đó sai, muốn thêm chức năng của mình hoặc muốn thêm một chuỗi thử nghiệm khác, ping @zeropiraeus vào phòng chat Python.

    Tóm lại: có khoảng chênh lệch 50 lần giữa các giải pháp hoạt động tốt nhất và tốt nhất cho bộ dữ liệu ví dụ lớn do OP cung cấp tại đây (thông qua nhận xét này). Giải pháp của David Zhang là người chiến thắng rõ ràng, vượt trội so với tất cả những người khác khoảng 5 lần cho bộ ví dụ lớn.

    Một vài câu trả lời rất chậm trong các trường hợp "không phù hợp" cực kỳ lớn. Mặt khác, các chức năng dường như phù hợp như nhau hoặc người chiến thắng rõ ràng tùy thuộc vào bài kiểm tra.

    Dưới đây là kết quả, bao gồm các lô được thực hiện bằng cách sử dụng matplotlib và seeborn để hiển thị các phân phối khác nhau:


    Corpus 1 (ví dụ được cung cấp - bộ nhỏ)

    mean performance:
     0.0003  david_zhang
     0.0009  zero
     0.0013  antti
     0.0013  tigerhawk_2
     0.0015  carpetpython
     0.0029  tigerhawk_1
     0.0031  davidism
     0.0035  saksham
     0.0046  shashank
     0.0052  riad
     0.0056  piotr
    
    median performance:
     0.0003  david_zhang
     0.0008  zero
     0.0013  antti
     0.0013  tigerhawk_2
     0.0014  carpetpython
     0.0027  tigerhawk_1
     0.0031  davidism
     0.0038  saksham
     0.0044  shashank
     0.0054  riad
     0.0058  piotr
    

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?


    Corpus 2 (ví dụ được cung cấp - bộ lớn)

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    0

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?


    Corpus 3 (trường hợp cạnh)

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    1

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?


    Các thử nghiệm và kết quả thô có sẵn ở đây.

    Giải pháp không regex:

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    2

    Giải pháp không regex nhanh hơn, nhờ @thatweirdo (xem bình luận):

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    3

    Giải pháp trên rất hiếm hơn so với bản gốc một vài phần trăm, nhưng nó thường nhanh hơn một chút - đôi khi nhanh hơn rất nhiều. Nó vẫn không nhanh hơn Davidism cho các chuỗi dài hơn và giải pháp Regex của Zero là vượt trội so với các chuỗi ngắn. Nó xuất hiện nhanh nhất (theo thử nghiệm của David trên GitHub - xem câu trả lời của anh ấy) với các chuỗi khoảng 1000-1500 ký tự. Bất kể, đó là sự nhanh chóng thứ hai đáng tin cậy (hoặc tốt hơn) trong mọi trường hợp tôi đã thử nghiệm. Cảm ơn, thatweirdo.

    Test:

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    4

    Results:

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    5

    Đã trả lời ngày 6 tháng 4 năm 2015 lúc 23:20Apr 6, 2015 at 23:20

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?

    TigerhawkT3TigerhawkT3TigerhawkT3

    47.5K6 Huy hiệu vàng57 Huy hiệu bạc89 Huy hiệu đồng6 gold badges57 silver badges89 bronze badges

    9

    Đầu tiên, giảm một nửa chuỗi miễn là đó là bản sao "2 phần". Điều này làm giảm không gian tìm kiếm nếu có số lượng lặp lại chẵn. Sau đó, làm việc về phía trước để tìm chuỗi lặp lại nhỏ nhất, kiểm tra xem việc chia chuỗi đầy đủ bằng cách ngày càng lớn hơn các kết quả chuỗi phụ trong các giá trị trống. Chỉ các chuỗi phụ lên đến

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    59 mới cần được kiểm tra vì bất cứ điều gì trên đó sẽ không có lặp lại.

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    6

    Điều này trả về trận đấu ngắn nhất hoặc không có nếu không có trận đấu.

    Đã trả lời ngày 7 tháng 4 năm 2015 lúc 2:42Apr 7, 2015 at 2:42

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?

    Davidismdavidismdavidism

    Huy hiệu vàng 114K2424 gold badges369 silver badges324 bronze badges

    0

    Vấn đề cũng có thể được giải quyết trong

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    60 trong trường hợp xấu nhất với chức năng tiền tố.

    Lưu ý, nó có thể chậm hơn trong trường hợp chung (cập nhật: và chậm hơn nhiều) so với các giải pháp khác phụ thuộc vào số lượng các giao hàng của

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    55, nhưng thường thấy thất bại sớm hơn, tôi nghĩ một trong những trường hợp xấu cho chúng sẽ là
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    62, nơi có
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    63 ________ 164's

    Trước hết bạn cần để tính toán chức năng tiền tố

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    7

    sau đó không có câu trả lời hoặc khoảng thời gian ngắn nhất là

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    8

    Và bạn chỉ cần kiểm tra xem

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    65 (nếu
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    65 thì câu trả lời là
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    67, nếu không có câu trả lời

    Bạn có thể kiểm tra bằng chứng ở đây (bằng tiếng Nga, nhưng người dịch trực tuyến có thể sẽ thực hiện thủ thuật)

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    9

    Đã trả lời ngày 8 tháng 4 năm 2015 lúc 16:04Apr 8, 2015 at 16:04

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?

    RIADRIADRiaD

    45,9k10 Huy hiệu vàng75 Huy hiệu bạc119 Huy hiệu đồng10 gold badges75 silver badges119 bronze badges

    3

    Phiên bản này chỉ thử những độ dài trình tự ứng cử viên là yếu tố của độ dài chuỗi; và sử dụng toán tử

    examples = [
        '0045662100456621004566210045662100456621',
        '0072992700729927007299270072992700729927',
        '001443001443001443001443001443001443001443',
        '037037037037037037037037037037037037037037037',
        '047619047619047619047619047619047619047619',
        '002457002457002457002457002457002457002457',
        '001221001221001221001221001221001221001221',
        '001230012300123001230012300123001230012300123',
        '0013947001394700139470013947001394700139470013947',
        '001001001001001001001001001001001001001001001001001',
        '001406469760900140646976090014064697609',
        '004608294930875576036866359447',
        '00469483568075117370892018779342723',
        '004739336492890995260663507109',
        '001508295625942684766214177978883861236802413273',
        '007518796992481203',
        '0071942446043165467625899280575539568345323741',
        '0434782608695652173913',
        '0344827586206896551724137931',
        '002481389578163771712158808933',
        '002932551319648093841642228739',
        '0035587188612099644128113879',
        '003484320557491289198606271777',
        '00115074798619102416570771',
    ]
    
    for e in examples:
        sub = repeated(e)
        if sub:
            print("%r: %r" % (e, sub))
        else:
            print("%r does not repeat." % e)
    
    8 để xây dựng một chuỗi có độ dài đầy đủ từ chuỗi ứng cử viên:

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    0

    Cảm ơn Tigerhawkt3 vì đã nhận thấy rằng

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    59 mà không có
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    70 sẽ không phù hợp với trường hợp
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    71.

    Đã trả lời ngày 7 tháng 4 năm 2015 lúc 6:13Apr 7, 2015 at 6:13

    Hướng dẫn how do you check a string is repeated in python? - làm thế nào để bạn kiểm tra một chuỗi được lặp lại trong python?

    2

    Đây là một giải pháp thẳng thắn, không có regexes.

    Đối với các chuỗi con của

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    30 bắt đầu từ chỉ số zeroth, có độ dài từ 1 đến
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    73, hãy kiểm tra xem đó có phải là chất nền đó không,
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    74 là mẫu lặp lại. Kiểm tra này có thể được thực hiện bằng cách kết hợp
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    74 với chính nó
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    76 lần, do đó chiều dài của chuỗi được hình thành bằng chiều dài của
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    30. Do đó
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    78.

    Trở lại khi tìm thấy đầu tiên như vậy. Điều này sẽ cung cấp các chuỗi con nhỏ nhất có thể, nếu một người tồn tại.

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    1

    Đã trả lời ngày 7 tháng 4 năm 2015 lúc 1:55Apr 7, 2015 at 1:55

    2

    Tôi bắt đầu với hơn tám giải pháp cho vấn đề này. Một số cơ sở trên Regex (Match, Findall, Split), một số cắt và kiểm tra chuỗi, và một số bằng các phương thức chuỗi (tìm, đếm, chia). Mỗi người đều có lợi ích trong sự rõ ràng về mã, kích thước mã, tốc độ và mức tiêu thụ bộ nhớ. Tôi sẽ đăng câu trả lời của mình ở đây khi tôi nhận thấy rằng tốc độ thực thi được xếp hạng là quan trọng, vì vậy tôi đã thực hiện nhiều thử nghiệm và cải tiến hơn để đi đến điều này:

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    2

    Câu trả lời này có vẻ tương tự như một vài câu trả lời khác ở đây, nhưng nó có một vài tối ưu hóa tốc độ mà những người khác chưa sử dụng:

    • The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
      The root substring of string : GeeksforGeeks
      
      79 nhanh hơn một chút trong ứng dụng này,
    • Nếu một chuỗi đầu vào là một độ dài lẻ, không kiểm tra bất kỳ chuỗi con dài nào,
    • Bằng cách sử dụng trực tiếp
      The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
      The root substring of string : GeeksforGeeks
      
      80, chúng tôi tránh tạo một biến trong mỗi vòng lặp.

    Tôi sẽ quan tâm để xem cách này thực hiện trong các thử nghiệm tiêu chuẩn với phần cứng phổ biến. Tôi tin rằng nó sẽ thiếu thuật toán xuất sắc của David Zhang trong hầu hết các bài kiểm tra, nhưng nên khá nhanh.

    Tôi thấy vấn đề này là rất phản trực giác. Các giải pháp tôi nghĩ sẽ nhanh chóng chậm. Các giải pháp trông chậm rất nhanh! Có vẻ như việc tạo chuỗi của Python với toán tử nhân và so sánh chuỗi được tối ưu hóa cao.

    Đã trả lời ngày 9 tháng 4 năm 2015 lúc 16:15Apr 9, 2015 at 16:15

    8

    Chức năng này chạy rất nhanh (được thử nghiệm và nó nhanh hơn 3 lần so với giải pháp nhanh nhất ở đây trên các chuỗi có hơn 100k ký tự và sự khác biệt càng lớn so với mẫu lặp lại càng dài). Nó cố gắng giảm thiểu số lượng so sánh cần thiết để có được câu trả lời:

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    3

    Lưu ý rằng ví dụ, đối với chuỗi chiều dài 8, nó chỉ kiểm tra đoạn có kích thước 4 và nó không phải kiểm tra thêm vì mẫu chiều dài 1 hoặc 2 sẽ dẫn đến mô hình lặp lại có độ dài 4:

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    4

    Đã trả lời ngày 22 tháng 4 năm 2015 lúc 0:10Apr 22, 2015 at 0:10

    Piotr dabkowskipiotr dabkowskiPiotr Dabkowski

    5.4434 Huy hiệu vàng37 Huy hiệu bạc47 Huy hiệu đồng4 gold badges37 silver badges47 bronze badges

    1

    Trong câu trả lời của David Zhang nếu chúng ta có một số bộ đệm tròn, điều này sẽ không hoạt động:

    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    81 do bắt đầu ____182, nơi tôi muốn nó nhổ ra:
    The original string is : GeeksforGeeksGeeksforGeeksGeeksforGeeks
    The root substring of string : GeeksforGeeks
    
    83.

    Mở rộng giải pháp của anh ấy, chúng tôi có thể sử dụng như sau:

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    5

    Đã trả lời ngày 23 tháng 12 năm 2016 lúc 1:30Dec 23, 2016 at 1:30

    Sachinruksachinruksachinruk

    9.11510 Huy hiệu vàng48 Huy hiệu bạc80 Huy hiệu Đồng10 gold badges48 silver badges80 bronze badges

    Nếu bạn chỉ muốn biết liệu một chuỗi có lặp lại trong một chuỗi khác hay không, thì đây là loại tốt nhất (theo ý kiến ​​của tôi) và đoạn ngắn nhất cho việc này:

    [
        '0045662100456621004566210045662100456621',             # '00456621'
        '0072992700729927007299270072992700729927',             # '00729927'
        '001443001443001443001443001443001443001443',           # '001443'
        '037037037037037037037037037037037037037037037',        # '037'
        '047619047619047619047619047619047619047619',           # '047619'
        '002457002457002457002457002457002457002457',           # '002457'
        '001221001221001221001221001221001221001221',           # '001221'
        '001230012300123001230012300123001230012300123',        # '00123'
        '0013947001394700139470013947001394700139470013947',    # '0013947'
        '001001001001001001001001001001001001001001001001001',  # '001'
        '001406469760900140646976090014064697609',              # '0014064697609'
    ]
    
    6

    Làm thế nào để bạn kiểm tra các chuỗi lặp lại trong Python?

    Cách tiếp cận là đơn giản,..
    Chuỗi phân tách đầu tiên được phân tách bằng không gian ..
    Bây giờ chuyển đổi danh sách các từ thành từ điển bằng cách sử dụng các bộ sưu tập. Phương pháp bộ đếm (iterator). Từ điển chứa các từ là khóa và tần số của nó là giá trị ..
    Bây giờ, danh sách các từ truyền lại và kiểm tra từ đầu tiên có tần số lớn hơn 1 ..

    Làm cách nào để kiểm tra xem một chuỗi có ký tự lặp lại không?

    Nếu chúng ta muốn biết liệu một chuỗi nhất định có các ký tự lặp lại hay không, cách đơn giản nhất là sử dụng phương pháp tìm kiếm xuất hiện đầu tiên từ cuối chuỗi, ví dụ: Lastindexof trong Java. Trong Python, sự tương đương sẽ là phương pháp RFind của loại chuỗi sẽ tìm kiếm sự xuất hiện cuối cùng của chuỗi con.use the existing method of finding first occurrence from the end of the string, e.g. lastIndexOf in java. In Python, the equivalence would be rfind method of string type that will look for the last occurrence of the substring.

    Sự lặp lại chuỗi trong Python là gì?

    Đôi khi chúng ta cần lặp lại chuỗi trong chương trình và chúng ta có thể thực hiện điều này một cách dễ dàng bằng cách sử dụng toán tử lặp lại trong Python.Toán tử lặp lại được ký hiệu là ký hiệu '*' và rất hữu ích cho việc lặp lại các chuỗi ở một độ dài nhất định.Ví dụ: STR = 'Chương trình Python' in (str*3)repeating strings to a certain length. Example: str = 'Python program' print(str*3)

    Làm thế nào để bạn kiểm tra xem một ký tự ở trong một chuỗi nhiều hơn một lần Python?

    Trên mỗi lần lặp, chúng tôi sử dụng phương thức str.Count () để kiểm tra xem ký tự xuất hiện nhiều hơn một lần trong chuỗi.Nếu điều kiện được đáp ứng, chúng ta sẽ trả về đúng và thoát ra khỏi chức năng.Nếu điều kiện không bao giờ được đáp ứng, chuỗi không chứa bất kỳ ký tự lặp lại nào và sai sẽ được trả về.str. count() method to check if the character appears more than once in the string. If the condition is met, we return True and exit out of the function. If the condition is never met, the string doesn't contain any repeated characters and False is returned.