12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- // Copyright 2018 gf Author(https://github.com/gogf/gf). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- package gstr
- // Levenshtein calculates Levenshtein distance between two strings.
- // costIns: Defines the cost of insertion.
- // costRep: Defines the cost of replacement.
- // costDel: Defines the cost of deletion.
- // See http://php.net/manual/en/function.levenshtein.php.
- func Levenshtein(str1, str2 string, costIns, costRep, costDel int) int {
- var maxLen = 255
- l1 := len(str1)
- l2 := len(str2)
- if l1 == 0 {
- return l2 * costIns
- }
- if l2 == 0 {
- return l1 * costDel
- }
- if l1 > maxLen || l2 > maxLen {
- return -1
- }
- tmp := make([]int, l2+1)
- p1 := make([]int, l2+1)
- p2 := make([]int, l2+1)
- var c0, c1, c2 int
- var i1, i2 int
- for i2 := 0; i2 <= l2; i2++ {
- p1[i2] = i2 * costIns
- }
- for i1 = 0; i1 < l1; i1++ {
- p2[0] = p1[0] + costDel
- for i2 = 0; i2 < l2; i2++ {
- if str1[i1] == str2[i2] {
- c0 = p1[i2]
- } else {
- c0 = p1[i2] + costRep
- }
- c1 = p1[i2+1] + costDel
- if c1 < c0 {
- c0 = c1
- }
- c2 = p2[i2] + costIns
- if c2 < c0 {
- c0 = c2
- }
- p2[i2+1] = c0
- }
- tmp = p1
- p1 = p2
- p2 = tmp
- }
- c0 = p1[l2]
- return c0
- }
|