2016-11-07 2 views
-2

Я хотел бы знать, как проверить, если строка представляет собой композицию из другого в случае ниже:Как проверить, является ли строка композицией другой строки?

isIn("xy","xyxy") -> true 
isIn("xy","xyxyx") -> true 
isIn("xy","xyxyy") -> false 

Я сделал это:

isIn(X,Y) -> 
case string:substr(Y,1,length(X)) == X of 
    true -> true; 
    false -> false 
end 

, но я не знаю, как для продолжения проверки остаток строки.

Спасибо

ответ

5

Один подход заключается в «повороте» подстрока при работе через строку проверяемую, сравнивая посимвольно:

is_in(_, []) -> true; 
is_in([H|T1], [H|T2]) -> is_in(T1++[H], T2); 
is_in(_,_) -> false. 

Первого пункт is_in/2 утверждает, что если мы 'проверил весь второй аргумент таким образом, что теперь это пустая строка, тогда ответ верен. Второе предложение проверяет с помощью сопоставления с образцом, что главы двух строк идентичны, и если это так, вызывает рекурсивно, когда голова первой строки поворачивается на хвост, а голова второй строки отбрасывается. Заключительное предложение is_in/2 возвращает false, чтобы обрабатывать случай, когда головки строк не совпадают.

Есть вероятность дополнительные проверки, которые необходимы на начальных аргументах, такие, как обеспечение длиной первой строки меньше или равен второй строки, гарантируя, что ни одна строка пуста, и т.д.

3

Существует более эффективное решение для работы

is_in(S1, S2) -> 
    is_in(S1, false, S1, S2). 

is_in(S1, A, [H|T1], [H|T2]) -> 
    is_in(S1, A, T1, T2); 
is_in([_|_] = S1, _, [], S2) -> 
    is_in(S1, true, S1, S2); 
is_in(_, A, _, []) -> A; 
is_in(_, _, _, _) -> false.