Если это домашнее задание, я предлагаю вам ознакомиться с объяснением, которое предшествует коду, а затем попробуйте самостоятельно, прежде чем смотреть на фактический код.
ниже код ищет все вхождения символов в query
строки в пределах subject
строки (переменные m
и связанные ii
, jj
). Затем он проверяет все возможные порядки этих случаев (переменная test
). Заказ является «приемлемым», если он содержит все необходимые символы (cond1
) в увеличении позиций (cond2
). Результат (переменная result
) является положительным, если существует хотя бы один приемлемый порядок.
subject = 'this is a test string';
query = 'ten';
m = bsxfun(@eq, subject.', query);
%'// m: test if each char of query equals each char of subject
[ii jj] = find(m);
jj = jj.'; %'// ii: which char of query is found within subject...
ii = ii.'; %'// jj: ... and at which position
test = nchoosek(1:numel(jj),numel(query)).'; %'// test all possible orders
cond1 = all(jj(test) == repmat((1:numel(query)).',1,size(test,2)));
%'// cond1: for each order, are all chars of query found in subject?
cond2 = all(diff(ii(test))>0);
%// cond2: for each order, are the found chars in increasing positions?
result = any(cond1 & cond2); %// final result: 1 or 0
Код может быть улучшена за счет использования лучшего подхода в отношении к test
, то есть не испытывая все возможные приказы по nchoosek
.
Загляните в ['regexp'] (http://www.mathworks.com/help/matlab/ ref/regexp.html) или ['regexpi'] (http://www.mathworks.com/help/matlab/ref/regexpi.html). – Doresoom
Если вы не можете использовать функции, такие как 'regexp', вы можете пройти через символ строки ввода по символу и сравнить с строкой соответствия. Помимо этого, пожалуйста, продемонстрируйте код, который вы пробовали! – darthbith