xref: /aosp_15_r20/external/cronet/base/strings/levenshtein_distance.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_STRINGS_LEVENSHTEIN_DISTANCE_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_STRINGS_LEVENSHTEIN_DISTANCE_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <optional>
11*6777b538SAndroid Build Coastguard Worker #include <string_view>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker // Returns the Levenshtein distance of `a` and `b`. Edits, inserts and removes
18*6777b538SAndroid Build Coastguard Worker // each count as one step.
19*6777b538SAndroid Build Coastguard Worker // If `k = max_distance` is provided, the distance is only correctly calculated
20*6777b538SAndroid Build Coastguard Worker // up to k. In case the actual Levenshtein distance is larger than k, k+1 is
21*6777b538SAndroid Build Coastguard Worker // returned instead. This is useful for checking whether the distance is at most
22*6777b538SAndroid Build Coastguard Worker // some small constant, since the algorithm is more efficient in this case.
23*6777b538SAndroid Build Coastguard Worker // Complexity:
24*6777b538SAndroid Build Coastguard Worker // - Without k: O(|a| * |b|) time and O(max(|a|, |b|)) memory.
25*6777b538SAndroid Build Coastguard Worker // - With k: O(min(|a|, |b|) * k + k) time and O(k) memory.
26*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t
27*6777b538SAndroid Build Coastguard Worker LevenshteinDistance(std::string_view a,
28*6777b538SAndroid Build Coastguard Worker                     std::string_view b,
29*6777b538SAndroid Build Coastguard Worker                     std::optional<size_t> max_distance = std::nullopt);
30*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t
31*6777b538SAndroid Build Coastguard Worker LevenshteinDistance(std::u16string_view a,
32*6777b538SAndroid Build Coastguard Worker                     std::u16string_view b,
33*6777b538SAndroid Build Coastguard Worker                     std::optional<size_t> max_distance = std::nullopt);
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker }  // namespace base
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker #endif  // BASE_STRINGS_LEVENSHTEIN_DISTANCE_H_
38