我的后续验证有什么问题?

Whats wrong in my subsequence validation?

我正在尝试使用此函数来检查列表 SEQUENCE 是否是列表 ARRAY 的子序列。子序列的意思是:必须有所有的数字,并且它们必须是相同的顺序。在下面的示例中,SEQUENCE 是 ARRAY 的子序列。 数组=[5, 1, 22, 25, 6, -1, 8, 10] 序列= [1, 6, -1, 10]

谁能告诉我为什么我的代码不起作用?

array=[5, 1, 22, 25, 6, -1, 8, 10] 
sequence= [1, 6, -1, 10]

def isValidSubsequence(array, sequence):
arrayValid=[]
if len(array) >= len(sequence):
    for i in range(len(sequence)):
        numSeq = sequence[i]
        for j in range(i, len(array)):
            numArr = array[j]
            if numSeq==numArr:
                arrayValid.append(numArr)
                array.remove(numArr)
            else:
                array.remove(numArr)
    if arrayValid==sequence:
        return True
    else:
        return False
else:
        return False

您在 j (for j in range(i, len(array)):) 上的循环从与序列中某个位置对应的索引开始。在数组中前进必须独立于序列中值的索引。

你可以用迭代器来做到这一点:

array=[5, 1, 22, 25, 6, -1, 8, 10] 
sequence= [1, 6, -1, 10]

iArray = iter(array)
isSubsequence = all(s in iArray for s in sequence)

print(isSubsequence) # True

s in iArray 部分将迭代器 (iArray) 推进到找到 s 的点。如果array以相同的顺序包含sequence的所有元素,那么sequence中的每个s都可以前进到iArray中的匹配值。

解决方案 1

public static boolean isValidSubsequence(List<Integer> array, List<Integer> sequence) {
    int sqInt = 0, arInt = 0;
        while (sqInt < sequence.size() && arInt < array.size()) {

            if (sequence.get(sqInt).equals(array.get(arInt))) {
                   sqInt++;
            }
            arInt++;
        }
        return sqInt==sequence.size();
  }

解决方案 2

public static boolean isValidSubsequence(List<Integer> array, List<Integer> sequence) {
   int sqInt=0;
        for(Integer val:array){
              if(sqInt==sequence.size()){
                    break;
                }
              if(sequence.get(sqInt).equals(val)){
                     sqInt++;
                }
        }
    return sqInt==sequence.size();
  }

解决方案 3

public static boolean isValidSubsequence(List<Integer> array, List<Integer> sequence) {
     int sqInt=0;
        for(Integer val:array){
              if(sqInt==sequence.size()){
                    break;
                }
              if(sequence.contains(val)){
                     sqInt++;
                }
        }
    return sqInt==sequence.size();
  }