"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
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func LongestDupSubstring(s string) string {
|
func DupSubstringLengthN(s string, n int) string {
|
||||||
return LongestDupSubstringGoroutines(s)
|
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