最长公共前缀(Java解法)

 

最长公共前缀(Java解法)

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

如果不存在公共前缀,返回空字符串 “”。
 
示例 1:

输入:strs = ["flower","flow","flight"]

输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]

输出:""

解释:输入不存在公共前缀。

提示:

1 <= strs.length <= 200

0 <= strs[i].length <= 200

strs[i] 仅由小写英文字母组成

 

题目来自:
https://leetcode-cn.com


Java解法如下:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class test {

    public static void main(String[] args) {
        //java键盘输入字符串数组
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = null;
        try {
            str = br.readLine().split(",");
        } catch (Exception e) {
            e.printStackTrace();
        }
        //调用方法一
        System.out.println(new test().longestCommonPrefix(str));
        //调用方法二
         //System.out.println(new test().longestCommonPrefix2());
    }

方法一,横向扫描

    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        //如果在尚未遍历完所有的字符串时,最长公共前缀已经是空串,则最长公共前缀一定是空串,因此不需要继续遍历剩下的字符串,直接返回空串即可。
        String prefix = strs[0];
        for (int i = 1; i < strs.length; i++) {
            prefix = longestCommonPrefix(prefix, strs[i]);
            //调用重载的方法,首先执行str[0]和str[1],返回了新的字符串以后,再执行新的字符串和str[2],以此类推
            if (prefix.length() == 0) {
                break;
            }//没有公共前缀直接跳出

        }
        return prefix;


    }

    public String longestCommonPrefix(String str1, String str2) {   //重载
        int length = Math.min(str1.length(), str2.length());//挑选出两个字符串中最短的那一个
        int index = 0;//索引从0开始
        while (index < length && str1.charAt(index) == str2.charAt(index)) {//当str1中index索引下的字符与str2中index索引下的字符相同时,index++循环
            index++;
        }
        return str1.substring(0, index);//返回str1字符串中 索引从0到index的字符,并组成新的字符串
    }

方法二,纵向扫描(必须搭配构造图)

最长公共前缀(Java解法)_第1张图片

方法二代码如下:

    public String longestCommonPrefix2(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }//如方法一
        int length = strs[0].length();//i的最大长度
        int count = strs.length;//j的最大长度
        //进入循环,按照图中红箭头形式
        for (int i = 0; i < length; i++) {
            char c = strs[0].charAt(i);//c的意思如图所示
            for (int j = 1; j < count; j++) {
                if (i == strs[j].length() || strs[j].charAt(i) != c) {
                    return strs[0].substring(0, i);//图中第三行和第四行为执行条件,对应上一行代码
                }
            }
        }
        return strs[0];
    }

}







你可能感兴趣的:(java)