【算法】14. 最长公共前缀(多语言实现)

简介: 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。

14. 最长公共前缀:

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

样例 1:

输入:

    strs = ["flower","flow","flight"]

输出:

    "fl"

样例 2:

输入:

    strs = ["dog","racecar","car"]

输出:

    ""

解释:

    输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

分析:

  • 面对这道算法题目,二当家的陷入了沉思。
  • 公共前缀,就是每个字符串的相同前缀。
  • 可以先看所有字符串的第一个字符是否相同,如果相同再看下一个,直到最短字符串的长度或者遇到字母不同。
  • 也可以先找到第一个和第二个字符串的公共前缀,再用它和第三个字符串找公共前缀,直到结束。

题解:

rust

impl Solution {
   
    pub fn longest_common_prefix(strs: Vec<String>) -> String {
   
        strs.split_first().map(|(first, tail)| {
   
            tail.iter().fold(first.as_str(), |ans, s| {
   
                &ans[0..s.as_bytes().iter()
                    .zip(ans.as_bytes())
                    .take_while(|(x, y)| x == y)
                    .count()]
            }).to_string()
        }).unwrap()
    }
}

go

func longestCommonPrefix(strs []string) string {
   
    ans := strs[0]
    l := len(strs)
    for i := 1; i < l; i++ {
   
        str := strs[i]
        index := 0
        var size int
        if len(ans) < len(str) {
   
            size = len(ans)
        } else {
   
            size = len(str)
        }
        for index < size && ans[index] == str[index] {
   
            index++
        }
        ans = ans[0:index]
    }
    return ans
}

c++

class Solution {
   
public:
    string longestCommonPrefix(vector<string>& strs) {
   
        string ans = strs[0];
        for (int i = 1; i < strs.size(); ++i) {
   
            string str = strs[i];
            int size = min(ans.size(), str.size());
            int index = 0;
            while (index < size && ans[index] == str[index]) {
   
                ++index;
            }
            ans = ans.substr(0, index);
        }
        return ans;
    }
};

java

class Solution {
   
    public String longestCommonPrefix(String[] strs) {
   
        String ans = strs[0];
        for (int i = 1; i < strs.length; ++i) {
   
            String str   = strs[i];
            int    size  = Math.min(ans.length(), str.length());
            int    index = 0;
            while (index < size && ans.charAt(index) == str.charAt(index)) {
   
                ++index;
            }
            ans = ans.substring(0, index);
        }
        return ans;
    }
}

typescript

function longestCommonPrefix(strs: string[]): string {
   
    let ans = strs[0];

    for (let i = 1; i < strs.length; ++i) {
   
        const str = strs[i];
        const size = Math.min(ans.length, str.length);
        let index = 0;
        while (index < size && ans[index] === str[index]) {
   
            ++index;
        }
        ans = ans.substring(0, index);
    }

    return ans;
};

python

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        ans = strs[0]
        for i in range(1, len(strs)):
            str = strs[i]
            size = min(len(ans), len(str))
            index = 0
            while index < size and ans[index] == str[index]:
                index += 1
            ans = ans[:index]
        return ans

非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~


相关文章
|
5月前
|
自然语言处理 Rust 算法
【算法】13. 罗马数字转整数(多语言实现)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 | 字符 | 数值 | |--|--| | I | 1 | | V | 5 | | X | 10 | | L | 50 | | C | 100 | | D | 500 | | M | 1000 | 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1
【算法】13. 罗马数字转整数(多语言实现)
|
5月前
|
算法
算法编程(二十五):检查单词是否为句中其他单词的前缀
算法编程(二十五):检查单词是否为句中其他单词的前缀
56 0
|
自然语言处理 Rust 算法
【算法】9. 回文数(多语言实现)
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
|
3月前
|
自然语言处理 Rust 算法
【算法】17. 电话号码的字母组合(多语言实现)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
【算法】17. 电话号码的字母组合(多语言实现)
|
4月前
|
存储 算法 Java
【经典算法】LeetCode14:最长公共前缀(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode14:最长公共前缀(Java/C/Python3实现含注释说明,Easy)
24 1
|
4月前
|
算法 自然语言处理 Rust
【算法】16. 最接近的三数之和(多语言实现)
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。
|
5月前
|
自然语言处理 Rust 算法
【算法】15. 三数之和(多语言实现)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。
|
5月前
|
算法 Java
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
38 0
|
5月前
|
自然语言处理 Rust 算法
【算法】11. 盛最多水的容器(多语言实现)
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明: 你不能倾斜容器。
【算法】11. 盛最多水的容器(多语言实现)
|
5月前
|
自然语言处理 Rust 算法
【算法】12. 整数转罗马数字(多语言实现)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而