Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -module (palindrome).
- -compile ([export_all]).
- maximal_palindrome_in (String) ->
- Stack = [],
- Largest = [],
- no_center_found (String, Stack, Largest).
- no_center_found (_RemainingInput = [], _Stack, Largest) -> Largest;
- no_center_found ([NextChar|RestOfInput], [NextChar|RestOfStack], Largest) ->
- Center = [NextChar, NextChar],
- center_found (RestOfInput, RestOfStack, [NextChar, NextChar|RestOfStack],
- Center, Largest);
- no_center_found ([NextChar1, NextChar2|RestOfInput], [NextChar2|RestOfStack],
- Largest) ->
- Center = [NextChar2, NextChar1, NextChar2],
- center_found (RestOfInput, RestOfStack,
- [NextChar2, NextChar1, NextChar2|RestOfStack], Center,
- Largest);
- no_center_found ([NextChar|RestOfInput], Stack, Largest) ->
- no_center_found (RestOfInput, [NextChar|Stack], Largest).
- center_found (_RemainingInput = [], _Stack = [], _, Center, Largest) ->
- if length (Center) > length (Largest) -> Center;
- true -> Largest
- end;
- center_found (_RemainingInput = [], [TopOfStack|RestOfStack], SavedStack, Center,
- Largest) ->
- Last = lists:last (Center),
- case (Last == TopOfStack) and ([Last|Center] == lists:reverse ([Last|Center])) of
- true ->
- NewCenter = [Last|Center],
- if length (NewCenter) > length (Largest) ->
- center_found ([], RestOfStack, SavedStack, NewCenter,
- NewCenter);
- true -> Largest
- end;
- _ ->
- if length (Center) > length (Largest) -> Center;
- true -> Largest
- end
- end;
- center_found (RemainingInput, Stack = [], SavedStack, Center, Largest) ->
- if length (Center) > length (Largest) ->
- no_center_found (RemainingInput, SavedStack, Center);
- true ->
- no_center_found (RemainingInput, SavedStack, Largest)
- end;
- center_found ([NextChar|RestOfInput], [NextChar|RestOfStack], SavedStack, Center,
- Largest) ->
- center_found (RestOfInput, RestOfStack,
- [NextChar|SavedStack],
- lists:concat([NextChar|Center],[NextChar]),
- Largest);
- center_found ([NextChar|RestOfInput], [TopOfStack|RestOfStack], SavedStack, Center,
- Largest) ->
- Last = lists:last (Center),
- case (NextChar == Last) and ([Last|Center] == lists:reverse ([Last|Center])) of
- true ->
- NewCenter = [Last|Center],
- if length (NewCenter) > length (Largest) ->
- center_found (RestOfInput, [TopOfStack|RestOfStack],
- [NextChar|SavedStack],
- NewCenter, NewCenter);
- true ->
- center_found (RestOfInput, [TopOfStack|RestOfStack],
- [NextChar|SavedStack],
- NewCenter, Largest)
- end;
- _ ->
- if length (Center) > length (Largest) ->
- no_center_found (RestOfInput, [NextChar|SavedStack], Center);
- true ->
- no_center_found (RestOfInput, [NextChar|SavedStack], Largest)
- end
- end.
- test() ->
- io:format("~p ~n", [maximal_palindrome_in ("abcde")]),
- io:format("~p ~n", [maximal_palindrome_in ("abbbaeeeeee")]),
- io:format("~p ~n", [maximal_palindrome_in ("abcdcbaabcdc")]).
- 1> palindrome:test().
- []
- "eeeeee"
- "cdcbaabcdc"
- ok
Advertisement
Add Comment
Please, Sign In to add comment