[LeetCode] #14 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
输入:strs = ["flower","flow","flight"]
输出:"fl"
暴力解法,拿字符串数组的第一个字符串中的第一个字符作为比对前缀,利用startsWith(prefix)看后面所有字符串是否有该前缀,都有的话比对前缀继续往后取,有一个没有就结束循环。
class Solution { public String longestCommonPrefix(String[] strs) { if(strs == null || strs.length == 0) return ""; String pre = ""; for(int len = 1; len <= strs[0].length(); len++){ pre = strs[0].substring(0,len); for(int i = 1; i < strs.length; i++) if(!strs[i].startsWith(pre)) return pre.substring(0,pre.length()-1); } return pre; } }
看别人的解法,直接取第一个字符串作为前缀和其他字符串比,不能作为前缀就缩短,继续看是不是前缀。
这种解法妙就妙在与前几个字符串比对后就已经将比对前缀缩短到了一定程度,使得后面比对次数大幅减少。
class Solution { public String longestCommonPrefix(String[] strs) { if(strs.length==0)return ""; String s=strs[0]; for (String string : strs) { while(!string.startsWith(s)){ if(s.length()==0)return ""; s=s.substring(0,s.length()-1); } } return s; } }
知识点:
boolean startsWith(String pre)方法一般用于检测某请求字符串是否以指定的前缀开始的。
与之相对应的方法为endsWith() ,用来判断字符串结尾的后缀。
substring() 方法返回字符串的子字符串。
public String substring(int beginIndex) 或 public String substring(int beginIndex, int endIndex)
-
beginIndex -- 起始索引(包括), 索引从 0 开始。
-
endIndex -- 结束索引(不包括)。
总结:有的时候,可以尝试逆向思维,比如找前缀不一定从空串开始累加,可以从一个完整字符串递减。