package strutil
import (
"fmt"
"strings"
"github.com/gookit/goutil/mathutil"
)
type SimilarComparator struct {
src, dst string
}
func NewComparator (src , dst string ) *SimilarComparator {
return &SimilarComparator {src , dst }
}
func Similarity (s , t string , rate float32 ) (float32 , bool ) {
return NewComparator (s , t ).Similar (rate )
}
func (c *SimilarComparator ) Similar (minDifferRate float32 ) (float32 , bool ) {
dist := c .editDistance ([]byte (c .src ), []byte (c .dst ))
differRate := dist / float32 (mathutil .Max (len (c .src ), len (c .dst ))+4 )
return differRate , differRate >= minDifferRate
}
func (c *SimilarComparator ) editDistance (s , t []byte ) float32 {
var (
m = len (s )
n = len (t )
d = make ([][]float32 , m +1 )
)
for i := 0 ; i < m +1 ; i ++ {
d [i ] = make ([]float32 , n +1 )
d [i ][0 ] = float32 (i )
}
for j := 0 ; j < n +1 ; j ++ {
d [0 ][j ] = float32 (j )
}
for j := 1 ; j < n +1 ; j ++ {
for i := 1 ; i < m +1 ; i ++ {
if s [i -1 ] == t [j -1 ] {
d [i ][j ] = d [i -1 ][j -1 ]
} else {
d [i ][j ] = mathutil .Min (d [i -1 ][j ]+1 , mathutil .Min (d [i ][j -1 ]+1 , d [i -1 ][j -1 ]+1 ))
}
}
}
return d [m ][n ]
}
type Builder struct {
strings .Builder
}
func (b *Builder ) Write (p []byte ) {
_, _ = b .Builder .Write (p )
}
func (b *Builder ) WriteRune (r rune ) {
_, _ = b .Builder .WriteRune (r )
}
func (b *Builder ) WriteByteNE (c byte ) {
_ = b .WriteByte (c )
}
func (b *Builder ) WriteString (s string ) {
_, _ = b .Builder .WriteString (s )
}
func (b *Builder ) Writef (tpl string , vs ...any ) {
_, _ = b .Builder .WriteString (fmt .Sprintf (tpl , vs ...))
}
func (b *Builder ) Writeln (s string ) {
_, _ = b .Builder .WriteString (s )
_ = b .WriteByte ('\n' )
}
func (b *Builder ) WriteAny (v any ) {
_, _ = b .Builder .WriteString (QuietString (v ))
}
func (b *Builder ) WriteAnys (vs ...any ) {
for _ , v := range vs {
_, _ = b .Builder .WriteString (QuietString (v ))
}
}
func (b *Builder ) WriteMulti (bs ...byte ) {
for _ , b2 := range bs {
_ = b .WriteByte (b2 )
}
}
func (b *Builder ) WriteStrings (ss ...string ) {
for _ , s := range ss {
_, _ = b .Builder .WriteString (s )
}
}
func (b *Builder ) ResetGet () string {
s := b .String ()
b .Reset ()
return s
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .