Unity中修正连续子序列检测逻辑:解决误判子集问题
修正连续子序列检测逻辑的方法
常见误判原因
- 把「元素都存在」当成了「连续子序列」:比如只校验
childObjectsPrefix的每个元素都在某个validOrders列表里,但没管顺序和是否连续。 - 索引匹配逻辑出错:比如匹配时没严格跟踪连续位置,中间断了还继续往下凑。
正确的检测逻辑实现
核心做法是:挨个遍历validOrders里的每个列表,对每个列表,检查有没有一个起始位置,从这个位置开始的连续N个元素(N是childObjectsPrefix的长度)和它完全对应。
具体代码示例(C#/Unity)
using System.Collections.Generic; using UnityEngine; public class SequenceChecker : MonoBehaviour { // 示例合法序列集合 public List<List<string>> validOrders = new List<List<string>>() { new List<string>{"A", "B", "C", "D"}, new List<string>{"X", "Y", "Z"} }; public List<string> childObjectsPrefix = new List<string>{"B", "C"}; void Start() { bool isMatch = IsContinuousSubsequence(); Debug.Log("是否匹配连续子序列:" + isMatch); } bool IsContinuousSubsequence() { // 要检测的序列为空的话,直接返回false(可根据自己需求调整) if (childObjectsPrefix.Count == 0) return false; foreach (var validList in validOrders) { // 合法列表比要检测的序列短,直接跳过 if (validList.Count < childObjectsPrefix.Count) continue; // 遍历所有可能的起始位置 for (int startIndex = 0; startIndex <= validList.Count - childObjectsPrefix.Count; startIndex++) { bool matchSuccess = true; // 逐个对比连续元素 for (int i = 0; i < childObjectsPrefix.Count; i++) { if (validList[startIndex + i] != childObjectsPrefix[i]) { matchSuccess = false; break; } } if (matchSuccess) { return true; // 找到匹配的直接返回,不用再查其他列表 } } } return false; // 所有列表都不匹配 } }
关键细节说明
- 避免索引越界:起始索引的上限设为
validList.Count - childObjectsPrefix.Count,比如合法列表长度是4,要检测的序列长度是2,起始索引最多到2,这样startIndex+1不会超出列表范围。 - 提升效率:一旦找到匹配的连续子序列,立刻返回true,不用继续遍历其他列表。
- 空序列处理:如果
childObjectsPrefix是空列表,根据自己的业务需求决定返回true还是false,示例里返回false,你可以自行调整。
针对原误判代码的修正点
如果你的原代码是类似下面这种只检查元素存在的错误写法:
// 错误示例:只校验元素存在,不管顺序和连续性 bool WrongCheck() { foreach(var validList in validOrders) { foreach(var item in childObjectsPrefix) { if(!validList.Contains(item)) goto NextList; } return true; NextList:; } return false; }
直接把上面的逻辑替换成前面的连续匹配逻辑就能解决误判问题。
内容的提问来源于stack exchange,提问作者Yidi
相关产品推荐
相关产品推荐

