Решение на Search от Йоанна Николова

Обратно към всички решения

Към профила на Йоанна Николова

Резултати

  • 15 точки от тестове
  • 0 бонус точки
  • 15 точки общо
  • 5 успешни тест(а)
  • 0 неуспешни тест(а)

Код

use std::collections::HashSet;
struct WordIterator<'a> {
txt: &'a str,
}
impl<'a> WordIterator<'a> {
pub fn new(text: &'a str) -> Self {
WordIterator{
txt: text,
}
}
fn split_when<F>(&mut self, mut func: F) -> (&'a str, &'a str)
where F:FnMut(char)->bool{
if self.txt.chars().count() == 0 {
return ("", "");

Е, не ти трябва chars().count(). Вярно е, че за броене на символи ни трябва, но 0 си е 0, независимо дали байтове или символи. Ако има поне един байт, трябва да има поне един символ (всички низове в Rust са валиден utf8, задължително), просто може примерно 4 байта да са 2 символа, or something.

Още повече, че count минава през всички символи, дори да е 0, така че това е доста неефективно :). По-добре откъм performance щеше да е chars().next().is_some().

}else if let Some(split_index) = self.txt.find(|x| func(x)){
self.txt.split_at(split_index)
}else{
(self.txt, "")
}
}
}
impl<'a> Iterator for WordIterator<'a> {
type Item = &'a str;
fn next(&mut self) -> Option<Self::Item> {
let (_, words) = self.split_when((|x| x.is_alphabetic()));
self.txt = words;
let (word, res) = self.split_when((|x| !x.is_alphabetic()));
self.txt = res;
if word != ""{
return Some(word);
}else{
return None;
}
}
}
pub fn extract_words(text: &str) -> Vec<String> {
WordIterator::new(text).map(String::from).collect()
}
#[derive(Debug)]
pub struct TextIndex {
dictionary: HashSet<String>,
}
impl TextIndex {
pub fn new() -> Self {
TextIndex{
dictionary: HashSet::new(),
}
}
pub fn push(&mut self, text: &str) {
self.dictionary.insert(String::from(text));
}
pub fn search(&self, query: &str) -> HashSet<&str> {
let words = extract_words(query);
let mut result = HashSet::new();
for word in words{
for text in self.dictionary.iter(){
if text.contains(word.as_str()) {
result.insert(text.as_str());
}
}
}
result
}
}

Лог от изпълнението

Compiling solution v0.1.0 (file:///tmp/d20180105-6053-esp411/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 4.88 secs
     Running target/debug/deps/solution-3f98bfa5c86a5dd9

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-3d9e4ea2eafbbc82

running 5 tests
test solution_test::test_extract_words_basic ... ok
test solution_test::test_extract_words_extra ... ok
test solution_test::test_search_multiple_words ... ok
test solution_test::test_search_special_cases ... ok
test solution_test::test_search_word ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests solution

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

История (1 версия и 2 коментара)