最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
-
前缀树解法:
// 定义前缀树数据结构 class Trie{ Trie[] nexts = new Trie[26]; // 记录经过该字符的单词个数 int path = 0; } Trie root = new Trie(); public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) { return ""; } // 初始化前缀树 for (int i = 0; i < strs.length; i++) { addStr(strs[i].toCharArray()); } StringBuilder sb = new StringBuilder(); Trie head = root; int totle = strs.length; // 获取前缀 while(true) { int i = 0; for (; i < 26; i++) { if (head.nexts[i] != null && head.nexts[i].path == totle) { sb.append((char)('a'+i)); head = head.nexts[i]; break; } } if (i == 26) { break; } } return sb.toString(); } // 前缀树添加单词 public void addStr(char[]chs) { Trie head = root; for (int i = 0; i < chs.length; i++) { if (head.nexts[chs[i]-'a'] == null) { head.nexts[chs[i]-'a'] = new Trie(); } head = head.nexts[chs[i]-'a']; head.path++; } }
-
普通解法( runtime 80%):
public String longestCommonPrefix(String[] strs) { if(strs.length == 0){ return ""; } String s = strs[0]; for (String str : strs) { if (s.length() > str.length()) { s = str; } } for (int i = s.length(); i > 0; i--) { int count = 0; for (String str : strs) { if (!str.startsWith(s.substring(0, i))) { break; } count++; } if (count == strs.length) { return s.substring(0, i); } } return ""; }