如何检查一个字符串是否是另一个字符串的组合?
问题描述:
我想知道如何检查是否一个字符串是另一种的情况下,组成波纹管:如何检查一个字符串是否是另一个字符串的组合?
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
,但我不知道如何继续检查其余的字符串。
谢谢
答
一种方法是“旋转”的子字符串通过你正在检查的字符串工作时,通过性格比较字符:
is_in(_, []) -> true;
is_in([H|T1], [H|T2]) -> is_in(T1++[H], T2);
is_in(_,_) -> false.
的is_in/2
的第一条指出,如果我们已经检查了整个第二个参数,现在它是空字符串,那么答案是正确的。第二个条款通过模式匹配来验证两个字符串的头部是否相同,如果是,则递归调用第一个字符串的头部旋转到其尾部并且第二个字符串的头部下降。 is_in/2
的最后一个子句返回false以处理不匹配的字符串头部的情况。
有需要的初始参数可能额外的检查,例如确保第一串的长度小于或等于所述第二串,以确保既不字符串是空的,等等
答
有更好的高性能解决方案
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.