Find the number of occurrences of a subsequence in a string

前端 未结 9 1576
粉色の甜心
粉色の甜心 2020-12-04 05:13

For example, let the string be the first 10 digits of pi, 3141592653, and the subsequence be 123. Note that the sequence occurs twice:



        
9条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-04 05:32

    My quick attempt:

    def count_subseqs(string, subseq):
        string = [c for c in string if c in subseq]
        count = i = 0
        for c in string:
            if c == subseq[0]:
                pos = 1
                for c2 in string[i+1:]:
                    if c2 == subseq[pos]:
                        pos += 1
                        if pos == len(subseq):
                            count += 1
                            break
            i += 1
        return count
    
    print count_subseqs(string='3141592653', subseq='123')
    

    Edit: This one should be correct also if 1223 == 2 and more complicated cases:

    def count_subseqs(string, subseq):
        string = [c for c in string if c in subseq]
        i = 0
        seqs = []
        for c in string:
            if c == subseq[0]:
                pos = 1
                seq = [1]
                for c2 in string[i + 1:]:
                    if pos > len(subseq):
                        break
                    if pos < len(subseq) and c2 == subseq[pos]:
                        try:
                            seq[pos] += 1
                        except IndexError:
                            seq.append(1)
                            pos += 1
                    elif pos > 1 and c2 == subseq[pos - 1]:
                        seq[pos - 1] += 1
                if len(seq) == len(subseq):
                    seqs.append(seq)
            i += 1
        return sum(reduce(lambda x, y: x * y, seq) for seq in seqs)
    
    assert count_subseqs(string='12', subseq='123') == 0
    assert count_subseqs(string='1002', subseq='123') == 0
    assert count_subseqs(string='0123', subseq='123') == 1
    assert count_subseqs(string='0123', subseq='1230') == 0
    assert count_subseqs(string='1223', subseq='123') == 2
    assert count_subseqs(string='12223', subseq='123') == 3
    assert count_subseqs(string='121323', subseq='123') == 3
    assert count_subseqs(string='12233', subseq='123') == 4
    assert count_subseqs(string='0123134', subseq='1234') == 2
    assert count_subseqs(string='1221323', subseq='123') == 5
    

提交回复
热议问题