rust实现最长公共前缀

210 阅读3分钟

这篇文章是rust解决算法问题的第五篇,感兴趣的同学可以去jibinbin 的个人主页 - 动态 - 掘金 (juejin.cn)查看其他文章,话不多说,直接进入正题。

最长公共前缀这道题是一个简单的问题,只要理清了思路,写起来还是很快的。思路的话,我用的是比较笨的那种方法,先找到字符串可变数组中最短的那个字符串,然后开始for循环拆分字符串为单个字符,遍历整个可变字符数组,是公共前缀就继续遍历,否则就退出。 想了解其他解法可以点击上方链接,前往leetcode查看各路大神的解法。这里先放一下之前写的js版本的,感兴趣的小伙伴可以浏览一下。

js版本

var longestCommonPrefix = function (strs) {
    let temp = '';
    let flag = 0;
    if (strs.length == 1) {
        return strs[0];
    }
    else {
        for (let i = 0; i < strs[0].length; i++) {

            for (let j = 0; j < strs.length; j++) {
                if (strs[j][i] == strs[0][i]) {
                    continue;
                }
                else {
                    flag = 1;
                    break;
                }
            }

            if (flag == 0) {
                temp += strs[0][i];
            }
            else {
                break;
            }
        }
    }

    return temp;
};

rust版本(已通过leetcode)

impl Solution {
    pub fn longest_common_prefix(strs: Vec<String>) -> String {
        let mut res = String::from("");
        let mut i = 0;
        let mut flag = true;
        
        let mut first = strs[0].clone();
        
        for item in strs.iter(){
            if item.len() <= first.len() {
                first = item.clone();
            }
        }
        
        if strs.len() == 1 {
            res = strs[0].clone();
        }else{
            for item in first.chars() {
                for item2 in strs.iter() {
                    if Solution::match_char(item2.to_string(),i,item) {
                        continue;
                    }
                    else{
                        flag = false;
                        break;
                    }
                }
                
                if flag == true {
                    i += 1;
                    res += &item.to_string();
                }else{
                    break;
                }
            }
        }
        
        res
    }

    fn match_char(str: String, index: usize , c: char) -> bool {
        &str[index..index+1] == c.to_string()
    }
}

image.png

问题以及解决思路

1

遇到的第一个问题,如何比较字符串中的某下标对应的字符和已有字符是否相等(Rust 的字符串不支持索引,这里只是为了表达解题思路,下面是rust程序设计语言的截图

image.png rust中,字符类型(char)是不能和字符串类型(String)进行比较的,

image.png

但是,可以将char用to_string()方法进行转换,

image.png

2

假如,我有一个这样的需求,现在有一个字符串可变数组,我想找出这个可变数组中长度最短的字符串,不知道为什么,我的第一想法竟然是利用HashMap,存储字符串和其长度,然后进行比较。在我第一次提交leetcode的时候,出现了数组越界的错误,原因是测试用例是这样的["aab","ab"],我刚开始写的程序默认是取第一个字符串,后来我仔细想了想,应该是取最短的那个数组进行遍历。转变了一下思路,直接一个临时变量和一个for循环就轻松解决。

3

觉得有关字符串的拼接有必要这里简单说明一下,rust并不想js那样,一个+号即可基本搞定,其中还有一些需要注意的地方,比如,两个String类型的字符串,想拼接起来,可能你会这样写:

image.png

报错了,错误的解决方式是给s2加个引用

image.png

成功解决之后,可能还是想再用s1做点其他的,于是

image.png

又报错了,原因在于借用的问题,s1在res1那里使用过之后,就是失效了,而res2这里又再次使用了,于是就报错了。我们可以使用format!宏来拼接字符串

image.png

想要了解更多关于String的内容,点击使用字符串(String)存储UTF-8编码的文本 - Rust 程序设计语言 简体中文版 (kaisery.github.io)