解法一:纵向扫描
将字符串数组看作一个二维空间,每一次从第一列开始。
确定所有字符子串中第一列字符。
逐层扫描后面每一列,遇到不同字符停止扫描。
图解:
复杂度分析:
时间复杂度: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]; } }