Advertisement
sek1pa

substring

Jan 22nd, 2018
888
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 1.60 KB | None | 0 0
  1. -module(solution).
  2. -export([main/0]).
  3.  
  4. main() ->
  5.     {ok,[Count]}=io:fread("","~d"),
  6.     main(Count,[]).
  7.  
  8. main(0,Acc) ->
  9.     lists:foreach(fun(Elem) ->  io:format("~s~n",[Elem]) end,lists:reverse(Acc));
  10.  
  11. main(Count,Acc) ->
  12.     {ok,[Str,SubStr]}=io:fread("","~s~s"),
  13.     Table=create_table(SubStr,dict:new(),string:len(SubStr)-2),
  14.     io:format("Table~p~n",[dict:to_list(Table)]),
  15.     Res=find_str(Table,Str,SubStr),
  16.     main(Count-1, [Res|Acc]).
  17.  
  18.  
  19. create_table(Str,Acc,Len) ->
  20.     Check=string:slice(Str,1),
  21.     if Check /= "" ->
  22.         create_table(string:slice(Str,1),dict:store(string:slice(Str,1,1),Len,Acc),Len-1);
  23.        Check == "" -> Acc end.
  24.  
  25. find_str(_,"",SubStr) -> "NO";
  26.  
  27. find_str(Table,Str,SubStr) ->
  28.     Len=string:len(SubStr),
  29.     LenStr=string:len(Str),
  30.     if Len>LenStr -> "NO";
  31.     Len=<LenStr ->
  32.     LastSymbStr=string:sub_string(Str,Len,Len),
  33.     LastSymbSub=string:sub_string(SubStr,Len,Len),
  34.     io:format("sravnenie ~p s ~p~n",[LastSymbStr,LastSymbSub]),
  35.     CharsEq=string:equal(LastSymbStr,LastSymbSub),
  36.     if CharsEq==false ->
  37.         case dict:find(LastSymbStr,Table) of
  38.         error -> find_str(Table, string:slice(Str,1),SubStr);
  39.         {ok,B} -> io:format("offset to ~p~n", [B]),
  40.             find_str(Table,string:slice(Str,B),SubStr)
  41.         end;
  42.        true -> Eq=equal_str(string:sub_string(Str,1,Len),SubStr),
  43.            if Eq ==true -> "YES";
  44.         true -> find_str(Table, string:slice(Str,1),SubStr) end
  45.         end
  46.     end .
  47. equal_str([],[]) -> true;
  48. equal_str([_],[]) -> true;
  49. equal_str([A|S1],[B|S2]) ->
  50.     if A==B ->
  51.         equal_str(S1,S2);
  52.        A/=B -> false
  53.     end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement