Ich sehe Fragen ähnlich wie diese, aber schließlich für verschiedene Programmiersprachen. Ich versuche, dieses kleine Problem zu lösen:Finden Sie die Länge des längsten Teilstrings
Gegeben eine Zeichenfolge, finden Sie die Länge der längsten Teilzeichenfolge ohne sich wiederholenden Zeichen. Zum Beispiel ist die längste Teilkette ohne sich wiederholende Buchstaben für
abcabcbb
abc
, die die Länge3
ist. Fürbbbbb
ist der längste Teilstringb
, mit der Länge1
.
Ich habe nicht die anwer es brauchen, aber warum das, was ich bisher in der zweiten Iteration nicht.
1> longest_substring:main("abcabcbb").
H: 97, T: "bcabcbb", Sub: []
Is 97 in []? false
H: 98, T: "cabcbb", Sub: 97
** exception error: no function clause matching string:chr(97,98,1) (string.erl, line 99)
in function longest_substring:process/2 (src/leetcode/algorithms/longest_substring.erl, line 28)
2>
Dies ist der Quellcode:
-module(longest_substring).
-export([main/1]).
-spec main(S :: string()) -> string().
%%%==================================================================
%%% Export
%%%==================================================================
main(S) -> process(S, "").
%%%==================================================================
%%% Internal
%%%==================================================================
process([], Sub) -> string:len(Sub);
process([H | T], Sub) ->
io:format("H: ~w, T: ~p, Sub: ~p~n", [H, T, Sub]),
Found = string:chr(Sub, H),
io:format("Is ~w in ~p? ~p~n", [H, Sub, Found =/= 0]),
% Don't know how to make this `if` thing better...
if
Found > 0 -> process(T, H);
_ -> process(T, string:concat(Sub, H))
end.
Dies funktioniert nicht mit der Zeichenfolge "abcdatfrseqgepz", es gibt "atfrseqg" statt "bcdatfrseqg" – Pascal
True, da der Code die ursprüngliche Code-Ansatz der Wegwerfen der gesamten akkumulierten Zeichenfolge verwendet, sobald es ein wiederholtes Zeichen sieht. Die Behebung ist einfach: benutze 'string: rchr/2' anstelle von' string: chr/2' und wenn'N' zurückgegeben wird, was nicht 0 ist, dann setze im zweiten Satz der 'case'' NewLast = {1 + LL-N, String: Teilstr (Last, N + 1) ++ [H]}, '. Ich werde den Beitrag bearbeiten, um diese Änderung vorzunehmen. –