编写一个函数来查找字符串数组中的最长公共前缀。
    如果不存在公共前缀,返回空字符串 “”。

    示例 1:
    输入:strs = [“flower”,”flow”,”flight”]
    输出:”fl”

    示例 2:
    输入:strs = [“dog”,”racecar”,”car”]
    输出:””
    解释:输入不存在公共前缀。

    因为是公共前缀,那么每个元素肯定都包含该前缀
    假设初始前缀字符串是数组第一个元素,遍历字符串数组,判断前缀字符串是否是字符串的前缀,若都是,则该前缀字符串即公共前缀字符串;
    若不是,则截取前缀字符串,缩短一位,再次遍历比较判断,直至前缀字符串是公共前缀或者无法匹配:
    image.png

    1. public String longestCommonPrefix(String[] strs) {
    2. if (strs.length == 0) {
    3. return "";
    4. }
    5. // 取数组第一个字符串作为对照
    6. String base = strs[0];
    7. // 根据字符串长度从最长子串从后往前遍历
    8. for(int i = base.length(); i > 0; i--) {
    9. // 截取字符串作为公共前缀
    10. String preStr = base.substring(0, i);
    11. boolean isAllStartWith = true;
    12. // 判断对照字符串是否是所有的字符串的前缀
    13. for(int j = 0; j< strs.length; j++) {
    14. if (!strs[j].startsWith(preStr)) {
    15. isAllStartWith = false;
    16. }
    17. }
    18. if (isAllStartWith) {
    19. return preStr;
    20. }
    21. }
    22. return "";
    23. }

    也可以同步比较字符串的每一位字符,若相同在向右移动,若不同,则表示已经不是公共前缀:
    image.png

    1. public String longestCommonPrefix(String[] strs) {
    2. if (strs == null || strs.length == 0) {
    3. return "";
    4. }
    5. // 前缀字符串
    6. String base = strs[0];
    7. for (int i = 0; i < base.length() ; i++){
    8. // 比较的字符
    9. char c = base.charAt(i);
    10. for (int j = 1; j < strs.length; j ++) {
    11. // 遇到了最短字符串
    12. if (i == strs[j].length()) {
    13. // 最长公共前缀
    14. return base.substring(0, i);
    15. }
    16. // 遇到了字符不相同
    17. if (strs[j].charAt(i) != c) {
    18. // 最长公共前缀
    19. return base.substring(0, i);
    20. }
    21. }
    22. }
    23. // 最长公共前缀
    24. return base;
    25. }