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


京公网安备 11010502036488号