这篇文章是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()
}
}
问题以及解决思路
1
遇到的第一个问题,如何比较字符串中的某下标对应的字符和已有字符是否相等(Rust 的字符串不支持索引,这里只是为了表达解题思路,下面是rust程序设计语言的截图)
rust中,字符类型(char)是不能和字符串类型(String)进行比较的,
但是,可以将char用to_string()方法进行转换,
2
假如,我有一个这样的需求,现在有一个字符串可变数组,我想找出这个可变数组中长度最短的字符串,不知道为什么,我的第一想法竟然是利用HashMap,存储字符串和其长度,然后进行比较。在我第一次提交leetcode的时候,出现了数组越界的错误,原因是测试用例是这样的["aab","ab"],我刚开始写的程序默认是取第一个字符串,后来我仔细想了想,应该是取最短的那个数组进行遍历。转变了一下思路,直接一个临时变量和一个for循环就轻松解决。
3
觉得有关字符串的拼接有必要这里简单说明一下,rust并不想js那样,一个+号即可基本搞定,其中还有一些需要注意的地方,比如,两个String类型的字符串,想拼接起来,可能你会这样写:
报错了,错误的解决方式是给s2加个引用
成功解决之后,可能还是想再用s1做点其他的,于是
又报错了,原因在于借用的问题,s1在res1那里使用过之后,就是失效了,而res2这里又再次使用了,于是就报错了。我们可以使用format!宏来拼接字符串
想要了解更多关于String的内容,点击使用字符串(String)存储UTF-8编码的文本 - Rust 程序设计语言 简体中文版 (kaisery.github.io)