2016-11-07 50 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. 
相關問題