1. 问题重述
比如我现在有一个 strArray = [“a”, “1”, “2”, “b”]; 我想确定里面是否包含[“1”, “2”]; ,由于MATLAB基础库中没有现成的函数可以直接检查连续子数组或连续多个元素的序列,下面给出自定义函数来实现这一功能。
2. 自定义函数
2.1 给出代码
function isContained = checkSequence(strArray, subSeq)
lenSubSeq = length(subSeq);
lenArray = length(strArray);
% 初始化isContained为false
isContained = false;
% 仅当子序列长度小于等于数组长度时才进行检查
if lenSubSeq <= lenArray
% 滑动检查是否存在完全匹配的子序列
for i = 1:lenArray-lenSubSeq+1
if all(strArray(i:i+lenSubSeq-1) == subSeq)
isContained = true;
break;
end
end
else
fprintf('ERROR:待检测序列超过了需检测序列')
end
end
2.2 原理分析:
通过遍历字符串数组,滑动检查子数组是否与给定子序列相等的方式,实现了对指定子序列是否包含在字符串数组中的检测。如果子序列超过字符串数组长度,会输出错误信息。核心代码是这个
% 滑动检查是否存在完全匹配的子序列
for i = 1:lenArray-lenSubSeq+1
if all(strArray(i:i+lenSubSeq-1) == subSeq)
isContained = true;
break;
end
end
这里i = 1:lenArray-lenSubSeq+1为观察窗口,strArray(i:i+lenSubSeq-1进行切片操作,每次滑动窗口进行观察和切片并且与待检测序列进行比对,比对成功即返回true
2.3测试代码
strArray = ["a", "1", "2", "b"];
subSeq1 = ["1", "2","b"];
subSeq2 = ["2", "1"];
containsSubSeq1 = checkSequence(strArray, subSeq1);
containsSubSeq2 = checkSequence(strArray, subSeq2);
disp(containsSubSeq1);
disp(containsSubSeq2);
输出结果如下