mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-04 12:52:28 +08:00
Strutil: HammingDistance func (#197)
* Strutil: HammingDistance func The Hamming distance is the number of positions at which the corresponding symbols are different * Add hamming distance doc
This commit is contained in:
@@ -61,6 +61,7 @@ import (
|
|||||||
- [ContainsAny](#ContainsAny)
|
- [ContainsAny](#ContainsAny)
|
||||||
- [RemoveWhiteSpace](#RemoveWhiteSpace)
|
- [RemoveWhiteSpace](#RemoveWhiteSpace)
|
||||||
- [SubInBetween](#SubInBetween)
|
- [SubInBetween](#SubInBetween)
|
||||||
|
- [HammingDistance](#HammingDistance)
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -1495,4 +1496,36 @@ func main() {
|
|||||||
// abc
|
// abc
|
||||||
// bc
|
// bc
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HammingDistance">HammingDistance</span>
|
||||||
|
|
||||||
|
<p>TBD</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
HammingDistance(a, b string) (int, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
result1, _ := strutil.HammingDistance("de", "de")
|
||||||
|
result2, _ := strutil.HammingDistance("a", "d")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 0
|
||||||
|
// 1
|
||||||
|
}
|
||||||
```
|
```
|
||||||
@@ -60,6 +60,8 @@ import (
|
|||||||
- [ContainsAll](#ContainsAll)
|
- [ContainsAll](#ContainsAll)
|
||||||
- [ContainsAny](#ContainsAny)
|
- [ContainsAny](#ContainsAny)
|
||||||
- [RemoveWhiteSpace](#RemoveWhiteSpace)
|
- [RemoveWhiteSpace](#RemoveWhiteSpace)
|
||||||
|
- [SubInBetween](#SubInBetween)
|
||||||
|
- [HammingDistance](#HammingDistance)
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -1496,4 +1498,36 @@ func main() {
|
|||||||
// abc
|
// abc
|
||||||
// bc
|
// bc
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HammingDistance">HammingDistance</span>
|
||||||
|
|
||||||
|
<p>HammingDistance calculates the Hamming distance between two strings. The Hamming distance is the number of positions at which the corresponding symbols are different</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
HammingDistance(a, b string) (int, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
result1, _ := strutil.HammingDistance("de", "de")
|
||||||
|
result2, _ := strutil.HammingDistance("a", "d")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 0
|
||||||
|
// 1
|
||||||
|
}
|
||||||
```
|
```
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
package strutil
|
package strutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
@@ -594,3 +595,24 @@ func SubInBetween(str string, start string, end string) string {
|
|||||||
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HammingDistance calculates the Hamming distance between two strings.
|
||||||
|
// The Hamming distance is the number of positions at which the corresponding symbols are different.
|
||||||
|
// This func returns an error if the input strings are of unequal lengths.
|
||||||
|
func HammingDistance(a, b string) (int, error) {
|
||||||
|
if len(a) != len(b) {
|
||||||
|
return -1, errors.New("a length and b length are unequal")
|
||||||
|
}
|
||||||
|
|
||||||
|
ar := []rune(a)
|
||||||
|
br := []rune(b)
|
||||||
|
|
||||||
|
var distance int
|
||||||
|
for i, codepoint := range ar {
|
||||||
|
if codepoint != br[i] {
|
||||||
|
distance++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return distance, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -667,3 +667,16 @@ func ExampleSubInBetween() {
|
|||||||
// abc
|
// abc
|
||||||
// bc
|
// bc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleHammingDistance() {
|
||||||
|
|
||||||
|
result, _ := HammingDistance("abc", "def")
|
||||||
|
fmt.Println(result)
|
||||||
|
|
||||||
|
result, _ = HammingDistance("name", "namf")
|
||||||
|
fmt.Println(result)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 3
|
||||||
|
// 1
|
||||||
|
}
|
||||||
|
|||||||
@@ -581,3 +581,26 @@ func TestSubInBetween(t *testing.T) {
|
|||||||
assert.Equal("", SubInBetween(str, "a", ""))
|
assert.Equal("", SubInBetween(str, "a", ""))
|
||||||
assert.Equal("", SubInBetween(str, "a", "f"))
|
assert.Equal("", SubInBetween(str, "a", "f"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHammingDistance(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "HammingDistance")
|
||||||
|
|
||||||
|
hd := func(a, b string) int {
|
||||||
|
c, _ := HammingDistance(a, b)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(0, hd(" ", " "))
|
||||||
|
assert.Equal(1, hd(" ", "c"))
|
||||||
|
assert.Equal(1, hd("a", "d"))
|
||||||
|
assert.Equal(1, hd("a", " "))
|
||||||
|
assert.Equal(1, hd("a", "f"))
|
||||||
|
|
||||||
|
assert.Equal(0, hd("", ""))
|
||||||
|
assert.Equal(-1, hd("abc", "ab"))
|
||||||
|
assert.Equal(3, hd("abc", "def"))
|
||||||
|
assert.Equal(-1, hd("kitten", "sitting"))
|
||||||
|
assert.Equal(1, hd("ö", "ü"))
|
||||||
|
assert.Equal(0, hd("日本語", "日本語"))
|
||||||
|
assert.Equal(3, hd("日本語", "語日本"))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user