"Longest Duplicate Substring" accepted solution, involving binary search and a map
This commit is contained in:
@@ -290,6 +290,51 @@ func LongestDupSubstringGoroutines(s string) string {
|
||||
return res
|
||||
}
|
||||
|
||||
func LongestDupSubstring(s string) string {
|
||||
return LongestDupSubstringGoroutines(s)
|
||||
func DupSubstringLengthN(s string, n int) string {
|
||||
StringMap := map[string]interface{}{}
|
||||
|
||||
for begin := 0; begin <= len(s)-n; begin++ {
|
||||
end := begin + n
|
||||
str := s[begin:end]
|
||||
|
||||
_, ok := StringMap[str]
|
||||
if ok {
|
||||
return str
|
||||
}
|
||||
|
||||
StringMap[str] = nil
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
func LongestDupSubstringBinarySearchAndMap(s string) string {
|
||||
maxLen := 0
|
||||
dups := map[int]string{}
|
||||
dups[0] = ""
|
||||
|
||||
left := 0
|
||||
right := len(s)
|
||||
mid := 0
|
||||
|
||||
for left < right {
|
||||
mid = (left + right) / 2
|
||||
res := DupSubstringLengthN(s, mid)
|
||||
|
||||
if len(res) > 0 {
|
||||
dups[mid] = res
|
||||
left = mid + 1
|
||||
if mid > maxLen {
|
||||
maxLen = mid
|
||||
}
|
||||
} else {
|
||||
right = mid
|
||||
}
|
||||
}
|
||||
|
||||
return dups[maxLen]
|
||||
}
|
||||
|
||||
func LongestDupSubstring(s string) string {
|
||||
return LongestDupSubstringBinarySearchAndMap(s)
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user