in reply to Seeking the longest string in an array

Update: Fixed. As Jenda observed, my original solution solved a problem other than the one presented.

O(N*log(N) + N*(M + M3) + M)
= O(N*log(N) + N*M3)
N = number of words.
M = length of words.

Don't let the M3 scare you. Benchmark them to find out which is best for you.

use strict; use warnings; my @data = qw/a mnk ab m b bc abcd cd bcd bd m nk /; @data = sort { length($a) <=> length($b) } @data; my %result; foreach my $word (@data) { my $uc_word = uc($word); my $partial_word; foreach my $start_letter (1..length($uc_word)) { foreach my $num_letters ($start_letter..length($uc_word)-$start_ +letter+1) { delete($result{substr($uc_word, $start_letter-1, $num_letters +)}); } } $result{$uc_word} = $word; } print join(",", values(%result));

Replies are listed 'Best First'.
Re^2: Seeking the longest string in an array
by Jenda (Abbot) on Dec 11, 2004 at 23:04 UTC

    I don't think your code is correct. You are only removing the items that are equal to some prefix of the currently processed $word. You should delete all substrings, not only the prefixes. That would make your solution O(N*log N + N*M*M). We don't know the expected N and M, but this makes the M much more important.

    Jenda
    We'd like to help you learn to help yourself
    Look around you, all you see are sympathetic eyes
    Stroll around the grounds until you feel at home
       -- P. Simon in Mrs. Robinson

      Shoot, you're right. I misunderstood what his program did.