题目描述:
编写一个函数以在字符串数组中找到最长的公共前缀字符串。
如果没有公共前缀,则返回一个空字符串""
。
题目示例:
示例 1:
输入: [“flower”,”flow”,”flight”]
输出: “fl”
示例 2:
输入: [“dog”,”racecar”,”car”]
输出: “”
解释: 输入不存在公共前缀。
说明: 所有输入只包含小写字母 a-z 。
读题可知:
题目要找的是最长前缀公共长度,找到则返回此公共字符串。无公共长度则返回空字符串””。
(说明此公共字符串有的话只会出现在前缀即数组的某一个字符串前面)
思考做题:
假设数组的第一个字符串里的第一个字符开始,去跟数组的第二个字符串的第一个字符比较,以此类推去跟第三、四……个字符串比较。第二遍循环是数组的第一个字符串里的第二个字符,去跟数组的第二个字符串的第二个字符比较,以此类推….第三遍、第四遍 乃至出现 比较不相等的情况下则返回当前循环的上一次循环比较相等得到的字符串。
代码:
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) {
return “”;
}
for (int i = 0; i < strs[0].length(); i++) {
// 第 0 个字符不需要比较,可以直接从第 1 个字符开始进比较
for (int j = 1; j < strs.length; j++) {
// 只要strs中存在比当前长度i更短的string,立刻返回上一轮LCP,即strs[0][:i]
// 只要strs中存在当前index字符与LCP该index不相同的字符串,立刻返回上一轮LCP,即strs[0][:i]
if (i >= strs[j].length() || strs[0].charAt(i) != strs[j].charAt(i)) {
return strs[0].substring(0, i);
}
}
}
return strs[0]; // 如果一直没返回,说明strs[0]本身就是LCP,返回它
}
}