LeetCode算法题(五):最长公共前缀

描述:

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

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

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

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

说明:
所有输入只包含小写字母 a-z

解法一:水平扫描(横推、向前)

class Solution {
    public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";
    for (int i = 0; i < strs[0].length() ; i++){
        char c = strs[0].charAt(i);
        for (int j = 1; j < strs.length; j ++) {
            if (i == strs[j].length() || strs[j].charAt(i) != c)
                return strs[0].substring(0, i);             
        }
    }
    return strs[0];
    }
}

解法二:字符串匹配(向后)

class Solution {
    public String longestCommonPrefix(String[] strs) {
   if (strs.length == 0) return "";
   String prefix = strs[0];
   for (int i = 1; i < strs.length; i++)
       while (strs[i].indexOf(prefix) != 0) {
           prefix = prefix.substring(0, prefix.length() - 1);
           if (prefix.isEmpty()) return "";
       }        
   return prefix;
    }
}

这两种方法的复杂度都是一样的:

时间复杂度:O(S)O(S),S 是所有字符串中字符数量的总和。

空间复杂度:O(1)O(1),我们只需要使用常数级别的额外空间。

解法三:二分查找罚

这种方法就是查找范围在(0,min [最小字符串长度])中的串,循环、二分、匹配 下去就完了,
匹配成功往右走,不成功往左走

结论:看似简单的题没有找到点子上就不简单了,如indexOf的使用、二分查找在字符串上的使用等

你可能感兴趣的:(笔记,算法)