首页 > 其他分享 >【LeeCode】14. 最长公共前缀

【LeeCode】14. 最长公共前缀

时间:2023-01-02 18:01:13浏览次数:62  
标签:length String strs 前缀 Solution LeeCode new longestCommonPrefix 14

【题目描述】

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

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

​​​​https://leetcode.cn/problems/longest-common-prefix/description/​


【示例】

【LeeCode】14. 最长公共前缀_字符串


【代码】官方:​​推荐​

从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。

class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";

int len = strs[0].length();
int count = strs.length;
for (int i = 0; i < len; i++) {
char c = strs[0].charAt(i);
for (int j = 1; j < count; j++){
// 这里有一个判字符为空的场景
if (i == strs[j].length() || strs[j].charAt(i) != c){
System.out.println(strs[0].substring(0, i));
return strs[0].substring(0, i);
}
}
}
return strs[0];
}
}


【代码】官方2

思路: 依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。

package com.company;
// 2023-01-02

class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";

String prefix = strs[0];
int len = strs.length;
for (int i = 1; i < len; i++) {
prefix = check(prefix, strs[i]);
if (prefix.length() == 0){
break;
}
}
return prefix;
}

// 2个字符串依次迭代进行判断
public String check(String s1, String s2){
// 返回最长的公共字符串
int len = Math.min(s1.length(), s2.length());
int index = 0;
while (index < len && s1.charAt(index) == s2.charAt(index)){
index++;
}
return s1.substring(0, index);
}

}
class Test{
public static void main(String[] args) {
new Solution().longestCommonPrefix( new String[]{"flower","flow","flight"}); // "fl"
new Solution().longestCommonPrefix( new String[]{"cir","car"}); // "c"
new Solution().longestCommonPrefix(new String[]{"dog","racecar","car"}); // ""
new Solution().longestCommonPrefix(new String[]{"reflower","flow","flight"}); // ""
new Solution().longestCommonPrefix(new String[]{"dog","racecar","car"}); // ""
new Solution().longestCommonPrefix(new String[]{""}); // ""
new Solution().longestCommonPrefix(new String[]{"a"}); // "a"
new Solution().longestCommonPrefix(new String[]{"ab", "a"}); // "a"
new Solution().longestCommonPrefix(new String[]{"",""}); // ""
}
}

【代码】admin

这里有个关键就是,前缀, 而非公共字符串 所以需要找一个最小的不为空的字符来进行一次比较 如果第一个字符都不一样, 那就没有公共的前缀


这里很多需要判断的地方, 如果字符串数组的长度是1,则直接返回即可(无论是空字符还是单个字符串)

还要判断字符串数组中是否有空字符串, 如果有空字符串,则直接返回空即可“”

思路: 找到最小的、合法字符串, 把数组转list 然后轮训判断min的每个字符是否存在于其他字符串中

PS: 看了其他的解法, 其实依次迭代进行对比就行, 还比较简单。另也不用最小的字符进行对比, 第一个就可

package com.company;
// 2023-01-02

import java.util.*;
import java.util.stream.Collectors;

class Solution {
public String longestCommonPrefix(String[] strs) {
// 如果只有一个字符串,则直接返回即可
if (strs.length == 1) return strs[0];
// 如果最小的字符串的长度是0, 则表示有为空的字符串, 直接返回空
String min = Arrays.stream(strs).filter(x -> x.length() >= 0).min(Comparator.comparingInt(String::length)).get();
// System.out.println("min --> " + min.length());
if (min.length() < 1) return "" ;
// 字符串数组转list
List<String> collect = Arrays.stream(strs).filter(x -> x.length() > 0).collect(Collectors.toList());

boolean flag = true;
StringBuilder sb = new StringBuilder();

for (int i = 0; i < min.length(); i++) {
for (String x : collect) {
if (x.charAt(i) != min.charAt(i)){
flag = false;
}
}
if (flag) {
sb.append(min.charAt(i));
}else {
System.out.println(sb.toString());
return sb.toString();
}
}

System.out.println(sb.toString());
return sb.toString();
}
}
class Test{
public static void main(String[] args) {
new Solution().longestCommonPrefix( new String[]{"flower","flow","flight"}); // "fl"
new Solution().longestCommonPrefix( new String[]{"cir","car"}); // "c"
new Solution().longestCommonPrefix(new String[]{"dog","racecar","car"}); // ""
new Solution().longestCommonPrefix(new String[]{"reflower","flow","flight"}); // ""
new Solution().longestCommonPrefix(new String[]{"dog","racecar","car"}); // ""
new Solution().longestCommonPrefix(new String[]{""}); // ""
new Solution().longestCommonPrefix(new String[]{"a"}); // "a"
new Solution().longestCommonPrefix(new String[]{"ab", "a"}); // "a"
new Solution().longestCommonPrefix(new String[]{"",""}); // ""
}
}

【代码】admin

思路1: 找到最小的字符, 然后判断字符c是否每个字符串都包含,但这里有个问题就是 如果类似 ”reflow”,"flow" 就会导致发现公共字符串,而并非最长公共前缀;  本例通过率  103/124

package com.company;
// 2023-01-02

import java.util.*;
import java.util.stream.Collectors;

class Solution {
public String longestCommonPrefix(String[] strs) {
String min = Arrays.stream(strs).min(Comparator.comparingInt(String::length)).get();
List<String> collect = Arrays.stream(strs).collect(Collectors.toList());
StringBuilder sb = new StringBuilder();
int index = 0;
for (int i = 0; i < min.length(); i++){
boolean flag = true;
char c = min.charAt(i);
for (String x : collect) {
if (x.indexOf(c) < 0 ){
index = -1;
flag = false;
break;
}
}
if (flag && index != -1)
sb.append(c);
}
System.out.println(sb.toString());
return sb.toString();
}
}
class Test{
public static void main(String[] args) {
new Solution().longestCommonPrefix( new String[]{"flower","flow","flight"}); // "fl"
new Solution().longestCommonPrefix( new String[]{"cir","car"}); // ""
new Solution().longestCommonPrefix(new String[]{"dog","racecar","car"}); // ""
}
}

标签:length,String,strs,前缀,Solution,LeeCode,new,longestCommonPrefix,14
From: https://blog.51cto.com/u_13682316/5983902

相关文章

  • 【LeeCode】58. 最后一个单词的长度
    【题目描述】给你一个字符串 ​​s​​,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的......
  • 14.平衡二叉树(AVL树)
    左旋转思想:当右子树的高度比左子树的高度高时(并且高度差绝对值超过了1时)代码示例:packagecn.com.avlTree;/***平衡二叉树*/publicclassAvlTreeDemo{......
  • 【LeeCode】118. 杨辉三角
    【题目描述】给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。​​https://leetcode.cn/problems/pascals-......
  • 【LeeCode】461. 汉明距离
    【题目描述】两个整数之间的 ​​汉明距离​​ 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 ​​x​​​ 和 ​​y​​,计算并返回它们之间的汉明距离......
  • 【LeeCode】9. 回文数
    【题目描述】回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,​​121​​​ 是回文,而 ​​123​​ 不是。​​​​https://leetcode.cn/problems/palindrom......
  • POJ 2114 Boatherds / Luogu P3806 【模板】点分治1
    POJ2114Boatherds/LuoguP3806【模板】点分治1难度:\(\mathtt{?}\)/省选/NOI-标签:点分治\(\mathtt{blog}\)\(n\)个点的树,边\((u_i,v_i)\)有边权\(w_i\),\(m\)......
  • 刷刷刷Day2| 142.环形链表II
    142.环形链表IILeetCode题目要求给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪......
  • 前缀和,差分
    前缀和,差分通俗理解前缀和听起来好高级啊,那么他究竟是什么啊?当询问一个区间[l,r]的和sum(忽略掉O(n)的暴力,它就发挥了大用处。基本的前缀和如下:s[i]=s[i-1]+a[i]......
  • 14、前端基础--ES6---let&const
    一、var与let的区别二、const声明变量特性......
  • 神经网络模型详讲(14)
    一、简介主要介绍了LeNet、AlexNet、VGGNet、ResNet、NetWorkInNetwork、GoogleNet;​​二、LeNet详解​​ LeNet-5是一个较简单的卷积神经网络。下图显示了......