Skip to content

Instantly share code, notes, and snippets.

@aksioto
Created June 8, 2022 07:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aksioto/b9ea2b94ecee334e5534c7767ee92a5b to your computer and use it in GitHub Desktop.
Save aksioto/b9ea2b94ecee334e5534c7767ee92a5b to your computer and use it in GitHub Desktop.
Finding Duplicates in a String in Golang

go test -bench BenchmarkCountLetters -benchtime=10000000x -benchmem

goos: windows
goarch: amd64
pkg: benching
cpu: Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
BenchmarkCountLetters/Test_1-8          10000000               174.0 ns/op             0 B/op          0 allocs/op
BenchmarkCountLetters/Test_2-8          10000000               310.7 ns/op             0 B/op          0 allocs/op
BenchmarkCountLetters/Test_3-8          10000000               619.9 ns/op           136 B/op          2 allocs/op
BenchmarkCountLetters/Test_4-8          10000000               756.2 ns/op           168 B/op          3 allocs/op
BenchmarkCountLetters/Test_5-8          10000000               400.2 ns/op            48 B/op          1 allocs/op
BenchmarkCountLetters/Test_6-8          10000000              1653 ns/op             459 B/op          3 allocs/op
BenchmarkCountLetters/Test_7-8          10000000                37.31 ns/op            0 B/op          0 allocs/op
BenchmarkCountLetters/Test_8-8          10000000                55.49 ns/op            0 B/op          0 allocs/op
package main
import (
"testing"
)
func BenchmarkUniqueCharacters(b *testing.B) {
b.Run("Test 1", func(b *testing.B) {
for i := 0; i < b.N; i++ {
hasUniqueCharacters1("abcdefghijklmnopqrstuvwxyz")
}
})
b.Run("Test 2", func(b *testing.B) {
for i := 0; i < b.N; i++ {
hasUniqueCharacters2("abcdefghijklmnopqrstuvwxyz")
}
})
b.Run("Test 3", func(b *testing.B) {
for i := 0; i < b.N; i++ {
hasUniqueCharacters3("abcdefghijklmnopqrstuvwxyz")
}
})
b.Run("Test 4", func(b *testing.B) {
for i := 0; i < b.N; i++ {
hasUniqueCharacters4("abcdefghijklmnopqrstuvwxyz")
}
})
b.Run("Test 5", func(b *testing.B) {
for i := 0; i < b.N; i++ {
hasUniqueCharacters5("abcdefghijklmnopqrstuvwxyz")
}
})
b.Run("Test 6", func(b *testing.B) {
for i := 0; i < b.N; i++ {
hasUniqueCharacters6("abcdefghijklmnopqrstuvwxyz")
}
})
b.Run("Test 7", func(b *testing.B) {
for i := 0; i < b.N; i++ {
hasUniqueCharacters7("abcdefghijklmnopqrstuvwxyz")
}
})
b.Run("Test 8", func(b *testing.B) {
for i := 0; i < b.N; i++ {
hasUniqueCharacters8("abcdefghijklmnopqrstuvwxyz")
}
})
}
package main
import (
"fmt"
"math/big"
"modernc.org/sortutil"
"sort"
)
func hasUniqueCharacters1(str string) (string, bool) {
for i := 0; i < len(str); i++ {
for j := i + 1; j < len(str); j++ {
if str[i] == str[j] {
return str, false
}
}
}
return str, true
}
func hasUniqueCharacters2(str string) (string, bool) {
chars := []rune(str)
length := len(chars)
for i := 0; i < length; i++ {
for j := i + 1; j < length; j++ {
if chars[j] == chars[i] {
return str, false
}
}
}
return str, true
}
func hasUniqueCharacters3(str string) (string, bool) {
chars := sortutil.RuneSlice(str)
length := len(chars)
sort.Sort(chars)
for i := 0; i < length-1; i++ {
if chars[i] == chars[i+1] {
return str, false
}
continue
}
return str, true
}
func hasUniqueCharacters4(str string) (string, bool) {
chars := []rune(str)
length := len(chars)
sort.Slice(chars, func(i int, j int) bool {
return chars[i] < chars[j]
})
for i := 0; i < length-1; i++ {
if chars[i] == chars[i+1] {
return str, false
}
continue
}
return str, true
}
func hasUniqueCharacters5(str string) (string, bool) {
var bits big.Int
for _, char := range str {
val := int(char)
if bits.Bit(val) != 0 {
return str, false
}
bits.SetBit(&bits, val, 1)
}
return str, true
}
func hasUniqueCharacters6(str string) (string, bool) {
var bits = make(map[int]bool, len(str))
for _, char := range str {
val := int(char)
if bits[val] {
return str, false
}
bits[val] = true
}
return str, true
}
const MAX_CHAR = 256
func hasUniqueCharacters7(str string) (string, bool) {
if len(str) > MAX_CHAR {
return str, false
}
chars := make([]bool, MAX_CHAR)
for _, char := range str {
val := int(char)
if chars[val] {
return str, false
}
chars[val] = true
}
return str, true
}
func hasUniqueCharacters8(str string) (string, bool) {
checker := 0
for _, char := range str {
index := char - 'a'
val := 1 << index
if checker&val > 0 {
return str, false
}
checker |= val
}
return str, true
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment