2016-04-10 3 views
-1

Hinzufügen versuche ich Nummer Vektor Und bekommenNicht übereinstimmTypen, wenn eine Zahl zu einem Vektorelement

let n = s.len(); 

let mut z: Vec<i32> = vec![0; n]; 

println!("{:?}", z); 

for i in 1..n { 
    while (i + z[i] < n) && (s[z[i]] == s[i + z[i]]) { 
     z[i] = z[i] + 1; 
    } 
} 

Element hinzufügen

ZFunction.rs:13:14: 13:18 error: mismatched types: expected usize , found i32 [E0308] ZFunction.rs:13 while (i + z[i] < n) && (s[z[i]] == s[i + z[i]]) {

+3

Indizes sind 'usize', so dass Sie wahrscheinlich wollen' Z' sein 'Vec '. Was versuchst du auch mit dieser Bedingung (i + z [i]) zu machen? Es wird eine ganze Zahl anstelle eines booleschen Wertes erzeugt. – jkiiski

+0

@jkiiski edit it –

+1

@StepanVanzuriak Sie haben die letzte Hälfte von jkiiskis Kommentar bearbeitet. Was ist mit dem ehemaligen? Wenn Sie Ihren Vektor so ändern, dass er vom Typ "usize" ist, wird Ihr Problem vollständig gelöst. –

Antwort

0

Wie @jkiiski Code vorgeschlagen mit z: Vec<usize> ganz gut funktioniert

Run code on Rust Playground

#[allow(dead_code)] 
fn z_func<T>(s: &[T]) -> Vec<usize> where T: PartialEq { 
    let n = s.len(); 

    let mut z: Vec<usize> = vec![0; n]; 

    println!("{:?}", z); 

    for i in 1..n { 
     while (i + z[i] < n) && (s[z[i]] == s[i + z[i]]) { 
      z[i] = z[i] + 1; 
     } 
    } 
    z 
} 

fn main() { 
    println!("Everything compiles!"); 
} 
+1

Beachten Sie, dass die Weitergabe von '& Vec ' unidiomatisch ist - '& [T]' wäre angemessener. –

+0

Guter Punkt @VladimirMatveev, ich habe die Antwort bearbeitet, um mehr idiomatisch zu sein. – ampron

0

Es ist meine Version

fn z_function(s: &str) -> Vec<usize> { 
let n = s.len(); 

let mut z: Vec<usize> = vec![0; n]; 

for i in 1..n { 
    while (i + z[i] < n) && (s.chars().nth(z[i]) == s.chars().nth(z[i] + i)) { 
     z[i] = z[i] + 1; 
    } 
} 

return z; 
} 
Verwandte Themen