| 145 | } |
| 146 | |
| 147 | std::size_t distance(std::string_view source, std::string_view target) |
| 148 | { |
| 149 | if (source.size() > target.size()) |
| 150 | { |
| 151 | return distance(target, source); |
| 152 | } |
| 153 | |
| 154 | const std::size_t min_size = source.size(), max_size = target.size(); |
| 155 | std::vector<std::size_t> lev_dist(min_size + 1); |
| 156 | |
| 157 | for (std::size_t i = 0; i <= min_size; ++i) |
| 158 | { |
| 159 | lev_dist[i] = i; |
| 160 | } |
| 161 | |
| 162 | for (std::size_t j = 1; j <= max_size; ++j) |
| 163 | { |
| 164 | std::size_t previous_diagonal = lev_dist[0]; |
| 165 | ++lev_dist[0]; |
| 166 | |
| 167 | for (std::size_t i = 1; i <= min_size; ++i) |
| 168 | { |
| 169 | const std::size_t previous_diagonal_save = lev_dist[i]; |
| 170 | if (source[i - 1] == target[j - 1]) |
| 171 | { |
| 172 | lev_dist[i] = previous_diagonal; |
| 173 | } |
| 174 | else |
| 175 | { |
| 176 | lev_dist[i] = std::min(std::min(lev_dist[i - 1], lev_dist[i]), |
| 177 | previous_diagonal) |
| 178 | + 1; |
| 179 | } |
| 180 | previous_diagonal = previous_diagonal_save; |
| 181 | } |
| 182 | } |
| 183 | |
| 184 | return lev_dist[min_size]; |
| 185 | } |
| 186 | |
| 187 | std::vector<std::string> sortByDistance(const std::string& source, |
| 188 | const std::vector<std::string>& words, std::size_t limit) |
no test coverage detected