如何检查字符串是否是另一个字符串的组合?

时间:2016-11-07 15:20:55

标签: erlang

我想知道在下面的情况下如何检查字符串是否是另一个的组合:

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

但我不知道如何继续检查字符串的其余部分。

谢谢

2 个答案:

答案 0 :(得分:4)

一种方法是"旋转"处理你要检查的字符串时的子字符串,逐个字符地比较:

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

is_in/2的第一个条款指出,如果我们检查了整个第二个参数,使它现在是空字符串,那么答案是正确的。第二个子句通过模式匹配验证两个字符串的头部是否相同,如果是这样,则递归调用第一个字符串的头部旋转到其尾部并且第二个字符串的头部被删除。 is_in/2的最后一个子句返回false以处理字符串头部不匹配的情况。

初始参数可能需要额外的检查,例如确保第一个字符串的长度小于或等于第二个字符串的长度,确保两个字符串都不为空,等等。

答案 1 :(得分:2)

有更好的性能解决方案

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.