【LeetCode】【Rust】【KMP】【双指针】28. 实现 strStr()
题目:实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = "hello", needle = "ll" 输出: 2 示例 2:
输入: haystack = "aaaaa", needle = "bba" 输出: -1 说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
思路:
Rust 考虑到编码的不同,不能和Java一样用 .charAt()来获取到字符, 考虑到效率的问题,也不能直接用浮标获取字符 Rust先用let chars = haystack .Chars()转为字符组也不能用浮标,只能对chars进行遍历 无形之中用Rust写提高了一些难度 最后只能用haystack.as_bytes();获取字符数组,再进行处理
答案:
双指针 + 回溯:
impl Solution {
pub fn str_str(haystack: String, needle: String) -> i32 {
if (needle.len() == 0){
return 0
}
let haystack = haystack.as_bytes();
let needle = needle.as_bytes();
let mut i =0;
let mut j =0;
while(i< haystack.len()){
if(haystack[i] == needle[j]){
println!("{},{},{}",haystack[i],i,j);
if(j==needle.len()-1){
return (i-j) as i32;
}
j+=1;
i+=1;
}else if(j != 0){
i=i-j+1;
j=0;
}else{
i+=1;
}
}
-1
}
}
KMP: 不说了,类型转换转得我头疼,明明思路都有了,后面都在写类型转换,如果有更好的处理方法,请指教!!!
impl Solution {
pub fn str_str(haystack: String, needle: String) -> i32 {
if (needle.len() == 0){
return 0
}
let haystack = haystack.as_bytes();
let needle = needle.as_bytes();
let mut i =0;
let mut j:i32 =0;
let mut next: Vec<i32> = Vec::new();
for i in (0..needle.len()){
next.push(0)
}
Self::getNext(&mut next,needle);
while(i< haystack.len() && j < needle.len() as i32){
if(j == -1 || haystack[i] == needle[j as usize]){
j+=1;
i+=1;
}else {
j = next[j as usize] ;
}
}
if (j >= needle.len() as i32){
return i as i32 -j
}
-1
}
fn getNext(next: &mut Vec<i32>,needle:&[u8]){
let mut k: i32 = -1;
let mut j: i32 = 0;
next[0] = -1;
while(j< needle.len() as i32 -1){
if(k == -1 || needle[j as usize] == needle[k as usize]){
k += 1;
j += 1;
next[j as usize] = k;
}else {
k = next[k as usize] as i32;
}
}
}
}
对了,我有个问题,是不是rust的提交,是不比运行时间的?? 不管快还是慢,都是百分之百,好像刷了几道题都是这样子 希望有缘人看到了能帮我解答一下
上一篇:
IDEA上Java项目控制台中文乱码
