解法一:纵向扫描
将字符串数组看作一个二维空间,每一次从第一列开始。
确定所有字符子串中第一列字符。
逐层扫描后面每一列,遇到不同字符停止扫描。
图解:
图片说明
复杂度分析:
时间复杂度:O(M*N) 其中 M 是字符串数组中的字符串的平均长度,N是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次

空间复杂度:O(1) 常数空间的复杂度

import java.util.*;


public class Solution {
    /**
     * 
     * @param strs string字符串一维数组 
     * @return string字符串
     */
    public String longestCommonPrefix (String[] strs) {

        if (strs == null || strs.length == 0) {
            return "";
        }

        //charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。所以这里不能 减去1 后续循环是0----length()-1 所以正好
        int row = strs.length;

        int column = strs[0].length();

        String maxCommonPrefix = "";

        for (int columnIndex = 0; columnIndex < column; columnIndex++) {

            char targetColumnChar = strs[0].charAt(columnIndex);

            for (int rowIndex = 1; rowIndex < row; rowIndex++) {

                //strs[rowIndex].length() == columnIndex 即:如当第二行为["c",""]时,直接结束即可 或者 ["cc","c"] 当遍历到第2个C 即index = 1时 此时再遍历第二行的字符串时,发现已经是第2个字符串的总长度 直接结束
                if (strs[rowIndex].length() == columnIndex || strs[rowIndex].charAt(columnIndex) != targetColumnChar) {
                    return strs[0].substring(0, columnIndex);
                }
            }
        }

        //各行各列都相等的情况 返回第一个字符串即可 或者 ["c","c"] 只有一行的情况 返回数组中的第一个
        return strs[0];
    }
}