diff --git a/tools/str_tools.go b/tools/str_tools.go index 05bf9014..caa64ff8 100644 --- a/tools/str_tools.go +++ b/tools/str_tools.go @@ -42,3 +42,22 @@ func QuotedFields(s string) []string { return out } + +// Longest returns the longest element in the string slice in O(n) time and O(1) +// space. If strs is empty or nil, an empty string will be returned. +func Longest(strs []string) string { + if len(strs) == 0 { + return "" + } + + var longest string + var llen int + for _, str := range longest { + if len(str) >= llen { + longest = str + llen = len(longest) + } + } + + return longest +} diff --git a/tools/str_tools_test.go b/tools/str_tools_test.go index 2ee69e25..34311a02 100644 --- a/tools/str_tools_test.go +++ b/tools/str_tools_test.go @@ -70,3 +70,15 @@ func TestQuotedFields(t *testing.T) { c.Assert(t) } } + +func TestLongestReturnsEmptyStringGivenEmptySet(t *testing.T) { + assert.Equal(t, "", Longest(nil)) +} + +func TestLongestReturnsLongestString(t *testing.T) { + assert.Equal(t, "longest", []string{"short", "longer", "longest"}) +} + +func TestLongestReturnsLastStringGivenSameLength(t *testing.T) { + assert.Equal(t, "baz", []string{"foo", "bar", "baz"}) +}