check if a string contains determinate sequence from last element to first

Question:

how can i check if a string contains determinate sequence from last element to first?

Example:

I have this sequence:

A, C, C, A, B, C

If sequence contains C [index:5], B[index:4], A[index:3] return true.

In this example the expected out is true

I have this sequence:

P, R, P, R, R

If sequence contains P [index:5], R[index:4], P[index:3] return true.

In this example the expected out is false

Asked By: xolag17921

||

Answers:

If you have your target sequence as list, you could slice your input in reversed order and check if equal:

# 1st
#input list
lst = ['A', 'C', 'C', 'A', 'B', 'C']

#target list
target = ['C', 'B', 'A']
len_target = len(target)

# get the ending index dependent on length of input and target list
idx = len(lst) - len_target - 1 # 5 - 3 - 1 = 2
print(lst[:idx:-1] == target) # lst[:2:-1] slice starting from the back till idx 2 (2 not included)
# ['C', 'B', 'A'] == ['C', 'B', 'A'] --> True

# 2nd
lst = ['P', 'R', 'P', 'R', 'R']
target = ['P', 'R', 'P']
len_target = len(target)
idx = len(lst) - len_target - 1

print(lst[:idx:-1] == target)
False

If you want to read more about how to slice lists, this question has very detailed explanation.

Answered By: Rabinzel

Rabinzel’s solution is good. If you want a solution using a loop you can do something like this:

Given seqeunce = 'ACCABC' and target = 'CBA'

def checkSeq(sequence, target):
    # This assumes target is the characters to be checked in reverse order from end of seqeuence
    if len(target) > len(sequence):
        return False

    pos = -1
    for ch in target:
        if sequence[pos] != ch:
            return False
        pos -= 1
    
    return True

Or this solution which ignores checking lengths and indexes entirely:

def checkSeq(sequence, target):
    # target is list of elements to check for at the end of sequence in the reverse order
    target = list(reversed(target))
    sequence = list(sequence)
    while sequence and target:
        if target.pop() != sequence.pop():
            return False
    return not (target and not sequence)
Answered By: nigh_anxiety
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.